目的
requests.Sessionを利用した際に、TCPコネクションを使い回せていることを確認します。
構成
FastAPIサーバを2つ立てます。クライアントにはcurlコマンドを利用します。
- server1.py
- クライアントに叩かれるサーバ
- server2.pyを叩くサーバ
- server2.py
- server1に叩かれるサーバ
ソースコード
server1.py
from typing import Union
from fastapi import FastAPI
app = FastAPI()
s = requests.Session()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
@app.get("/connect_backend_server")
def connect_backend_server():
return s.get('http://localhost:8001').json()
server2.py
from typing import Union
from fastapi import FastAPI
import requests
app = FastAPI()
@app.get("/")
def read_root():
return {"Hello": "World"}
@app.get("/items/{item_id}")
def read_item(item_id: int, q: Union[str, None] = None):
return {"item_id": item_id, "q": q}
サーバ起動
$ uvicorn server1:app --reload --port=8000
$ uvicorn server2:app --reload --port=8001
実験
5秒(uvicornのkeep-alive timeoutのデフォルト値)以内に2回リクエストを送ります。
$ curl http://127.0.0.1:8000/connect_backend_server
{"Hello":"World"}
$ curl http://127.0.0.1:8000/connect_backend_server
{"Hello":"World"}
server2.pyのログ
INFO: 127.0.0.1:62090 - "GET / HTTP/1.1" 200 OK
INFO: 127.0.0.1:62090 - "GET / HTTP/1.1" 200 OK
どちらも同じportで通信している(TCPコネクションを使い回せている)ことがわかります。もう少しわかりやすい確認方法があればコメントいただけますと幸いです。(パケットキャプチャは少し面倒なのでPython側で確認できる手段があると嬉しいのですが・・)