前言#
fly.io は、負荷分散と自動スケーリング機能を提供する、現代のアプリケーションデリバリープラットフォームです。アプリケーションの信頼性とパフォーマンスを確保します。
fly.io の負荷分散のドキュメントによれば、fly.io はリクエスト数または TCP 接続数に基づいて自動的にスケーリングすることができます。前回、友人の API が攻撃を受けてサーバーがダウンしたため、彼の API はブラウザ以外で使用されているため、アプリケーションやスクリプトなどの防御策を取るのが難しいです。そのため、彼に fly.io への移行をおすすめしました。
配置#
まず、プログラムを Docker にパッケージ化し、fly.io にデプロイします。私は 2H512M の設定を使用し、11 つのインスタンスを作成しました。
次に、fly.toml
を使用して各インスタンスの最大接続数を設定します。[services.concurrency]
を使用します。設定の例:
# fly.toml app configuration file generated for cheat-show-backend on 2023-09-15T18:53:53-05:00
#
# See https://fly.io/docs/reference/configuration/ for information about how to use this file.
#
app = "XXXXXXXXXXXX"
primary_region = "lax"
swap_size_mb = 1024
[http_service]
internal_port = 8080
force_https = false
auto_stop_machines = true
auto_start_machines = true
min_machines_running = 0
processes = ["app"]
[services.concurrency]
type = "connections"
hard_limit = 10000
soft_limit = 1200
[build]
dockerfile = "Dockerfile"
soft_limit
はソフト制限であり、fly.io はこの接続数を評価して各インスタンスを制限します。単一のインスタンスがこの接続数を超えると、他のインスタンスが起動され、自動的にスケーリングが行われます。wrk
を使用してテストした結果、デプロイしたサービスは単一のインスタンスで 2,000 の同時接続をサポートできることがわかりました。スケーリングに十分な時間を与えるために、制限を 1,200 に変更しました。この値を下回る場合、fly.io は 1 つのマシンのみを起動します。この値を超える場合は、接続数に基づいて複数のマシンが起動します。
hard_limit
はハード制限であり、単一のインスタンスがこの値を超えると 503 が返されます。
压测#
默认状态#
连接数巨增状态 (wrk 5000 线程)#
通常、1 つのマシンのみが起動され、1 分ごとに請求が行われます。1 つのマシンは 1 か月で 3.8 ドルかかります。接続数が減少すると、自動的に 1 つのマシンにスケールダウンされ、停止状態のインスタンスには料金が発生しません。
关于一些坑#
fly.io の負荷分散は、最も近いソースに戻ります。ニューヨークに 1 つのインスタンスがあり、ロサンゼルスに 1 つのインスタンスがある場合、デフォルトではロサンゼルスを開いておきたいと思います。ニューヨークがバックアップの場合、ロサンゼルスのサーバーが fly.io に逆プロキシを行う必要があります。直接アクセスすると、fly.io は最も近いインスタンスを起動します。たとえば、ニューヨークのユーザーがアクセスすると、ニューヨークのインスタンスが起動されます。接続数が 1 であってもです。そのため、私は fly.io のロサンゼルス地域に 3 つの nginx リバースプロキシインスタンスをデプロイしました。3 つの 1h256m のインスタンスを使用して負荷分散を行い、最適化後、単一のインスタンスで 1 万以上の同時接続を実現できます。
更新: 同じ地域の自動スケーリングの問題が修正されたようです。以前は同じ地域の場合、すべてのマシンがデフォルトで負荷分散され、弾力性は異なる地域にのみ適用されました。この問題は解消され、現在は同じ地域でも有効です。
。
最適化されたDockerfile
FROM nginx
RUN sed -i 's/worker_processes auto;/worker_processes 8;/' /etc/nginx/nginx.conf
RUN sed -i 's/worker_connections [0-9]*;/worker_connections 9999999;/' /etc/nginx/nginx.conf
COPY nginx.conf /etc/nginx/conf.d/nginx.conf
nginx.conf
server {
listen 8080 default_server;
listen [::]:8080 default_server;
server_name api.test.com;
keepalive_timeout 75s;
keepalive_requests 100;
location / {
proxy_pass http://ip:80;
proxy_set_header Host $host;
proxy_set_header Upgrade $http_upgrade;
proxy_http_version 1.1;
}
}
これにより、低コストでサービスの自動スケーリングが実現できます。
成本问题#
nginx をデプロイするための 3 つのインスタンスは無料です。バックエンドのインスタンスは基本的に 1 つしか開始されず、1 か月につき 3.8 ドルかかります。開始されていないインスタンスには料金が発生しません。