2017-04-04 8 views
1

私たちはNATSを使用しており、3ノード以上のクラスタリングを使用しています。私たちはいくつかの生産者と多くの消費者を持っています。メッセージサイズは小さく(〜100bytes)、スループットはやや高いです。 〜40k /秒。すべてのトラフィックは、2x10gbpsボンディングされた内部ネットワーク上にあります。NATSは水平にスケーリングされますか(スループット)

もっと多くのノードでクラスタをスケーリングすると、クラスタのスループットが向上するのではないかと不思議でした。より多くのメッセージ/秒が書かれているので、少し遅延があります。

2次的なメモとして、スループットを向上させるためのヒント/ヒントはありますか?私たちは現在protobufsを使用していますが、サーバーの調整ができますか?

答えて

2

特定のサブジェクトに一致するサブスクリプションが多数ある場合、スループットが影響を受ける可能性があります。

たとえば、1つの接続を使用しており、fooに公開しているとします。 fooに100件の定期購読があります。サーバーはメッセージを受け取ると、それをすべての一致するサブスクリプションに配信します。この場合、サブスクリプションが同じ接続に属しているかどうかにかかわらず、TCPがこのメッセージを100回送信することを意味します。

サブスクライバへの送信中に、サーバーはこの接続によって公開された他のメッセージを読み取っていません。

サーバーを追加して水平方向にスケーリングするクラスタにサブスクリプションの負荷を分散すると役立ちます。上記の例では、50人の消費者が1つのサーバーにあり、50が別のサーバーにあるとすると、公開メッセージを受信するサーバーは、そのメッセージを50 + 1回だけ送信する必要があります(50人はローカル加入者、1人はルート)。もう一方のサーバーは50のメッセージをローカル加入者に送信します。

しかし、サーバを追加するだけでは、一致するサブスクリプションが1つ(または、ない)あった場合、1つの接続スループットは向上しません。

パブスループットを向上させるもう1つの方法は、より多くの接続を使用することです。サーバーは接続ごとにgoルーチンを使用するため(ソケットからデータを読み取り、サブスクリプションに送信するため)、いくつかの作業を並列化することができます。

私はあなたのマシンで得ることができる上限を得るために、レポに含まれるいくつかのベンチマークを実行することができました。たとえば、サーバーベンチテストでは、通常、NATSクライアントを使用せずに直接ソケットにデータを書き込みます。これは、クライアントの実装によって課される制限なく、サーバーのパフォーマンスを測定することである。

go test -v -run=xxx -bench=. ./test 

は、あなたがメッセージを送信し、それらがどのようにサブスクリプションコールバックで処理されている方法を見て確認してください。パフォーマンスを向上させるためにできることは、それ以上の価値があります。

これが役に立ちます。

関連する問題