(オリジナル)NSQソースコード読み取りおよび分析(1)

 オリジナルソースします。https://www.cnblogs.com/lihaiping/p/12324371.html

主な目的は、ポスト個人要約とレビューを容易にすることであるNSQソースを読むことを学習し、学習にこの記事では、文書、彼のノートのいくつかを。

著者:Lihapidagl603 @ aliyunkcom

日付:2020年1月13日

送り出されたメッセージのNSQはの信頼性を確保する方法です

memoryMsgChanニュースがいっぱいになった場合、メッセージルータチャネルがルーティング次の()関数のトピックであろうため、それはメモリちゃん、memoryMsgChanにincomingMsgChanでそのチャネルにメッセージを転送する、ブロックされ、それはメッセージであろうバックエンドに書き込まれました。

memoryMsgChanメッセージの場合、チャネルは()関数は、再び流れ、彼はmemoryMsgChanチャネルから受信したメッセージを送信し、転送し、再び行くclientMsgChan messagePumpになります。

各クライアントのネットワーク・リンクの場合は、NSQはゴルーチンとクライアントのすべてのメッセージを処理するために)このクライアントネットワークIOLoop(へのリンクを作成します。クライアントは、サブスクリプションSUBコマンド、トピックに基づいて、クライアントとそのサブスクリプションチャネルを送信し、クライアントへのチャネルMSGをプッシュするゴルーチンを起動すると、この機能はmessagePump()関数です。messagePumpクライアントでは、主なタスクは、送信とハートビートとclientMsgChanチャネルメッセージから情報を受信し、クライアントへのメッセージのパッケージを送信することです。もちろん、メッセージは、我々は、クライアントの時間にメッセージをプッシュするときに我々はクライアントので、メッセージを維持する必要があるので、メッセージが失敗する可能性があるため、失敗しました。ここでNSQが良いフォールトトレランス戦略を行うにはので、失敗する可能性がクライアントに送信しましたタイムアウトが、そのメッセージがニュースシャネル転送処理のチャネルに流れるように、同じペットのトピックの循環を再びする場合は、このメッセージは、チャネルにそれになるタイムアウトポリシーを開始します。

そして、メッセージmsgと他のメッセージオブジェクトinFlightMessageとクライアントを生成するためにclient.Channel.StartInFlightTimeout(MSG、クライアント)関数を呼び出すことによって、ネットワーク・メッセージ・クライアントを送信する前に、メッセージオブジェクトはさらにカプセル化され、タイムアウトを増やしますpqueue.Itemに、チャンネルとinFlightMessagesがマップされ、彼はIDのMSGを格納inFlightMessages inFlightPQ、に格納されているクライアントは、削除操作キーに、後から応答メッセージを受信したとき、それが便利になります。inFlightPQながらチャンネルは、特にときinFlightPQスーパーのニュースを扱うためのゴルーチン機能inFlightWorkerを開始しますので、これは、残業をどうする主です。

メインでinFlightWorker()でこのメッセージが失われる可能性がありますか起こるどんな問題、我々は再する必要があることを示し、タイムアウト時間がアップしている場合は、メッセージがinFlightPQキューから削除されていないキューでPQメッセージからタイムアウト時間に基づいて取るし続けることニュースの流れ。

 

おすすめ

転載: www.cnblogs.com/lihaiping/p/12324371.html