メッセージ キューは一般的なシステム アーキテクチャ パターンであり、高い同時実行性と非同期タスク処理を処理する上で非常に重要な役割を果たします。 Go 言語では、いくつかのオープンソース メッセージ キュー ライブラリとツールを通じて、メッセージ キューの使用が非常に便利かつ簡単になりました。
この記事では、次のような Go でのメッセージ キューの使用方法を紹介します。
メッセージ キューは、データのキャッシュ、非同期処理の実装、ピーク負荷の軽減 (短期間での大量の同時リクエストに対処するため)、負荷分散などのタスクを実行でき、設計をサポートする重要な部分です。大規模分散システムの構築。
一般的なメッセージ キュー
さらに、メッセージ キューはメッセージを非同期で処理するため、タスクをオフロードして、単一マシンでの同時実行性が高くならないようにすることができます。したがって、メッセージ キューは次のシナリオで使用できます:
大量のデータの処理: Web サイト ログ内の大量のサーバー データの処理、ストレス テストなど;Go でメッセージ キューを使用する方法を例で示します
いくつかの Web サイトから画像データをクロールし、ローカルに保存したいとします。 go を使用してこのプログラムを完了できます。一部の画像の非同期ダウンロードを実装するには、RabbitMQ をメッセージ キューとして使用し、Go で次の手順を実行します。
RabbitMQ のインストール
RabbitMQ をインストールします。公式 Web サイトのダウンロード アドレス: https://www.rabbitmq.com/download.html;github.com/streadway/amqp ライブラリを使用して RabbitMQ と対話できます。以下はコードです。
まず、ダウンロードする必要がある画像アドレスをクロールするクローラー コードを作成し、それを RabbitMQ に送信します。
func main() { spider() } func spider() { url := "https://www.example.com" doc, _ := goquery.NewDocument(url) doc.Find(".img_wrapper img").Each(func(i int, s *goquery.Selection) { imgUrl, _ := s.Attr("src") publishToMQ(imgUrl) }) } func publishToMQ(msg string) { conn, err := amqp.Dial("amqp://test:test@localhost:5672/test") failOnError(err, "Failed to connect to RabbitMQ") defer conn.Close() ch, err := conn.Channel() failOnError(err, "Failed to open a channel") defer ch.Close() q, err := ch.QueueDeclare( "image_downloader", // name true, // durable false, // delete when unused false, // exclusive false, // no-wait nil, // arguments ) failOnError(err, "Failed to declare a queue") err = ch.Publish( "", // exchange q.Name, // routing key false, // mandatory false, // immediate amqp.Publishing{ ContentType: "text/plain", Body: []byte(msg), }) failOnError(err, "Failed to publish a message") log.Printf(" [x] Sent %s", msg) }
次に、画像ダウンローダーを作成します。 RabbitMQ のメッセージ キューをリッスンすることで、非同期の画像ダウンロードが実現されます:
func main() { consumeMQ() } func consumeMQ() { conn, err := amqp.Dial("amqp://test:test@localhost:5672/test") failOnError(err, "Failed to connect to RabbitMQ") defer conn.Close() ch, err := conn.Channel() failOnError(err, "Failed to open a channel") defer ch.Close() q, err := ch.QueueDeclare( "image_downloader", // name true, // durable false, // delete when unused false, // exclusive false, // no-wait nil, // arguments ) failOnError(err, "Failed to declare a queue") msgs, err := ch.Consume( q.Name, // queue "", // consumer true, // auto-ack false, // exclusive false, // no-local false, // no-wait nil, // args ) failOnError(err, "Failed to register a consumer") forever := make(chan bool) go func() { for d := range msgs { log.Printf("Received a message: %s", d.Body) downloadImage(string(d.Body)) } }() log.Printf(" [*] Waiting for messages. To exit press CTRL+C") <-forever } func downloadImage(url string) { resp, err := http.Get(url) if err != nil { log.Fatal(err) } defer resp.Body.Close() file, err := os.Create(uuid.New().String() + ".jpg") if err != nil { log.Fatal(err) } defer file.Close() _, err = io.Copy(file, resp.Body) if err != nil { log.Fatal(err) } log.Printf("Downloaded an image: %s", url) }
上記のコードでは、ワーク キュー「image-downloader」を作成しました。プロデューサーが HTML ページの画像アドレスを解析した後、ワークキューに入れられ、メッセージを送信します。コンシューマはワーク キューをリッスンし、メッセージを受信した後、downloadImage 関数を呼び出してイメージ ファイルをダウンロードします。
上記の例は、RabbitMQ を使用した簡単な使用例です。他のメッセージ キュー ライブラリの使用も同様で、異なる API を介して接続と操作を実装する必要があるだけです。
概要
この記事では、メッセージ キューとは何かについて紹介し、説明します。大量のデータ処理シナリオでは、非同期の使用が不可欠です。 Go 言語は、独自のコルーチン メカニズムにより、非同期タスクの処理をシンプルかつ効率的にします。 Go 言語自体の豊富なオープンソース ライブラリと組み合わせることで、メッセージ キューを使用して非同期メッセージ処理を実装することが非常に簡単になります。
上記の例から、非同期タスク処理を実装する場合、メッセージキューを使用すると処理効率が大幅に向上し、Go 言語でメッセージキューを使用することも非常に便利であることがわかります。プロジェクトでは、RabbitMQ や Apache Kafka などのオープン ソースのメッセージ キュー ライブラリを使用することをお勧めします。
以上がGoでメッセージキューを使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。