HareGo:RabbitMQがGoと出会うとき

投稿日:

(Arsham Shirvani)(2020年12月18日)

はじめに

Blokurでは、非同期にRabbitMQを利用していますマイクロサービス間の通信とジョブの管理。 AMQP ライブラリはGoアプリケーションのデファクトスタンダードですが、レベルが非常に低いため、柔軟でテスト可能なコードを作成するのが困難です。

Goの世界には、RabbitMQとの通信を容易にする高レベルのライブラリがいくつかあります。残念ながら、それらは私たちのすべてのユースケースを満足させるものではなかったか、それらが提供するものに非常に具体的であったため、私たちが作業するのは非常に困難でした。そこで、独自のライブラリを構築することにしました。

日常業務の最も重要な部分である問題の解決のために、すぐに作業を開始できるものが必要でした。それを取り巻くものはすべて開発コストであり、モデルに適合しません。

HareGoに入る

独自の作成を検討し始めましたライブラリには次の特徴があります。

  1. AMQPライブラリのほぼすべての側面をサポートする必要があります。
  2. 十分にテストされ、簡単にテストできる必要があります。
  3. 使いやすく拡張可能である必要があります。
  4. 正常に機能する正常なデフォルトが付属している必要があります。
  5. 同時に安全である必要があります。
  6. 機能を備えていると便利です。 (Nackだけでなく)メッセージを再キューイングし、再キューイングする前にメッセージを操作できるようにします。

このライブラリをオープンソース化したことをお知らせします。この記事の執筆時点では、Goバージョン 1.14 以降をサポートしています。

API

HareGoのインターフェースは非常にシンプルです。便利な haregoを使用して harego.Client オブジェクトを作成する必要があります。 NewClient()関数。 NewClient()関数の唯一の要件は、RabbitMQサーバーのアドレスです。 harego.ConfigFunc ライブラリによって提供される構成関数。

デフォルトでは、 harego.Client は、一度に1つの公開リクエストまたは1つの消費リクエストを処理する1つのワーカーを作成します。クライアントはランダムなコンシューマー名を取得します。デフォルトの動作では、 autoDelete autoAck すべてのメッセージのプロパティはfalseです。ただし、必要に応じて別の方法で設定できます。

harego.Workers(3) 3つの同時ワーカーを持つ構成関数。これは、メッセージの公開と消費に適用されます。ライブラリは、次に利用可能なメッセージを次に利用可能なワーカースロットに配信することを保証します。

harego.QueueName()設定により、クライアントが対話するキューを通知します。デフォルトのキュー名は「harego」です。

クライアントは、次の仕様のインターフェイスです:

メッセージの公開

メッセージを公開するには、 * amqp.Publishing Publish メソッドのdiv>オブジェクト。メッセージは次に利用可能なワーカーによって処理されます。

メッセージの消費

消費メソッドは、ブローカーから新しいメッセージを受信するたびにハンドラーを使用するブロッキング呼び出しです。コンテキストがキャンセルされるか、クライアントが閉じられると、消費が停止します。

ハンドラーは、 AckType 値と遅延。遅延は、ブローカーに応答する前にスリープする必要がある期間を指定し、AckType値は、メッセージに何が起こるかを指定します。

AckType値

を設定する決定が行われました。複数のワーカーの場合に1つのメッセージのみに応答するために、ackの「複数」の値をfalseにします。ワーカーシステムを機能させるには、プリフェッチ値を少なくともワーカーの数に設定する必要があります。

このタイプには4つの値があります。

  1. AckTypeAck :msg.Ackで応答します。
  2. AckTypeNack :msg.Nackで応答します。
  3. AckTypeReject :msg.Rejectで応答します。
  4. AckTypeRequeue :メッセージをキューに送り返し、msg.Ackで応答します。詳細については、「メッセージの再キューイング」セクションを参照してください。

メッセージの再キューイング

AMQPライブラリを使用すると、 Nack メッセージを送信すると、次に利用可能なコンシューマーに配信されます。場合によっては、これが期待どおりではなく、メッセージをキューの最後に戻して再度配信する必要があります。 HareGoを使用すると、それが可能になるだけでなく、再キューイングする前にメッセージを操作することもできます。最大5回の再キューイングの例を次に示します。

ヒントとコツ

複数の接続

このライブラリを使用する場合は、アドレス指定する複数の harego.Client オブジェクトを作成しますロジックのさまざまな側面。 1つのキューから読み取り、2つのキューに書き込み、3つのオブジェクトを作成し、最初のキューのコンシューマー内の2つのパブリッシャーを呼び出すとします。

テスト可能なコード

harego.Client 、新しいクライアントとエラーを返す関数タイプを作成できます。モック生成ライブラリを使用して、 harego.Client インターフェースからモックを作成し、テストで使用できます。

次のスニペットでは、モックを生成するために mockery ライブラリを使用しており、を証明しています。 モックをアサートするためのライブラリ。もちろん、最も使いやすいライブラリを選択できます。

最後の言葉

詳細については、ライブラリのリポジトリにアクセスしてください。機能のリクエストが必要な場合、またはライブラリに問題が見つかった場合は、githubポータル内で問題を作成してください。

参加に関心があります。チーム? このリンクにアクセスしてお申し込みください。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です