Goでメッセージキューを使用するにはどうすればよいですか?

PHPz
リリース: 2023-05-11 15:46:54
オリジナル
1637 人が閲覧しました

メッセージ キューは一般的なシステム アーキテクチャ パターンであり、高い同時実行性と非同期タスク処理を処理する上で非常に重要な役割を果たします。 Go 言語では、いくつかのオープンソース メッセージ キュー ライブラリとツールを通じて、メッセージ キューの使用が非常に便利かつ簡単になりました。

この記事では、次のような Go でのメッセージ キューの使用方法を紹介します。

  1. メッセージ キューについて
  2. 一般的なメッセージ キュー
  3. 利点Go でメッセージ キューを使用する適用可能なシナリオ
  4. #Go 言語のメッセージ キュー ライブラリ
  5. # Go でメッセージ キューを使用する方法を例を通して説明します
  6. #メッセージ キューについて
メッセージ キューは、キューを使用してメッセージをキャッシュし、非同期に送信し、保存するアーキテクチャ パターンです。メッセージ キューは通常、プロデューサー、コンシューマー、キューの 3 つの部分に分かれています。プロデューサはメッセージをキューに送信し、コンシューマは処理のためにキューからメッセージを取得します。メッセージ キューの目的は、プロデューサーとコンシューマー間の時間と空間の依存関係を切り離し、非同期タスク処理を実装することです。

メッセージ キューは、データのキャッシュ、非同期処理の実装、ピーク負荷の軽減 (短期間での大量の同時リクエストに対処するため)、負荷分散などのタスクを実行でき、設計をサポートする重要な部分です。大規模分散システムの構築。

一般的なメッセージ キュー

市場には、さまざまなプログラミング言語をサポートするメッセージ キュー ライブラリとツールが多数あります。より一般的なものには次のようなものがあります:

RabbitMQ: RabbitMQ は、AMQP、STOMP、MQTT などの複数のプロトコルとプログラミング言語をサポートするオープン ソースのメッセージ キュー システムです。開発者は、Go、Java、Python などのさまざまな言語クライアントを通じてアクセスできます。 RabbitMQ は Erlang 言語で書かれており、IoT、グループ チャット、監視などのリアルタイム処理シナリオをサポートするために広く使用されています。
  1. Apache Kafka: Apache Kafka は、LinkedIn によって開発されたパブリッシュ/サブスクライブ モデルに基づくメッセージ キュー システムであり、主に継続的なストリーミング データ処理を処理するために使用されます。 Kafka は、高スループットと高スケーラビリティをサポートするために、複数のパーティションを通じてメッセージを分散します。
  2. ActiveMQ: ActiveMQ は、AMQP、STOMP、Openwire などの複数の送信プロトコルとプログラミング言語アクセスをサポートする、一般的な JMS ベースのメッセージ キュー システムです。
  3. NSQ: NSQ はリアルタイム分散メッセージ処理プラットフォームで、nsq と nsqd の 2 つのコンポーネントで構成されます。nsq はクライアント対話用の TCP プロキシ サーバーであり、nsqd は永続的なメッセージとキュー用のサービスです。
  4. Go でメッセージ キューを使用する利点と適用可能なシナリオ
Go 言語はコルーチンをネイティブにサポートしているため、メッセージ キューを使用して非同期タスクを処理するのが特に適しています。 Go 言語は、メッセージ キュー用のオープン ソース ライブラリとツールを多数提供しており、これらも比較的使いやすいものです。

さらに、メッセージ キューはメッセージを非同期で処理するため、タスクをオフロードして、単一マシンでの同時実行性が高くならないようにすることができます。したがって、メッセージ キューは次のシナリオで使用できます:

大量のデータの処理: Web サイト ログ内の大量のサーバー データの処理、ストレス テストなど;
  1. 非同期処理とタスク分散: 電子メール送信、SMS 通知など;
  2. 分散タスク キュー: 0 キュー、バックログ キューなど;
  3. 複数のコンシューマー同時実行シナリオ: 電子商取引のフラッシュ セール、同時多発コメントなど。
  4. アプリケーションの分離と拡張: 外部メッセージ サービス通知の統合やシステム間のデータ対話の分離など。
  5. Go 言語のメッセージ キュー ライブラリ
Go 言語では、次のようなオープン ソースのメッセージ キュー ライブラリが多数利用可能です。

RabbitMQ AMQP クライアントライブラリ: https://github.com/streadway/amqp;
  1. Apache Kafka クライアント ライブラリ: https://github.com/confluentinc/confluent-kafka-go;
  2. NSQ クライアント ライブラリ: https://github.com/nsqio/go-nsq。
  3. これらのオープン ソース ライブラリを使用すると、さまざまなメッセージ キュー システムに簡単に接続できるため、開発者はビジネスラインのロジック開発により集中できるようになり、開発効率とコードの可読性が向上します。

Go でメッセージ キューを使用する方法を例で示します

以下では、簡単な例で Go でメッセージ キューを使用する方法を示します。

いくつかの Web サイトから画像データをクロールし、ローカルに保存したいとします。 go を使用してこのプログラムを完了できます。一部の画像の非同期ダウンロードを実装するには、RabbitMQ をメッセージ キューとして使用し、Go で次の手順を実行します。

RabbitMQ のインストール

RabbitMQ をインストールします。公式 Web サイトのダウンロード アドレス: https://www.rabbitmq.com/download.html;
  1. RabbitMQ を設定します。インストール後、bin ディレクトリに入り (Windows 以外のプラットフォームの場合は .bat 接尾辞を無視してください)、./rabbitmqctl start を実行します。 RabbitMQ を開始するには;
  2. MQ 仮想ホストを作成して実行します: ./rabbitmqctl add_vhost test;
  3. ユーザーを追加して権限を割り当て、実行します: ./rabbitmqctl add_user test test, ./rabbitmqctl set_permissions - p test test ".
  4. " ".
  5. " ".*";RabbitMQ Web 管理インターフェイスを起動し、次のコマンドを実行します。 ./rabbitmq-plugins enable Rabbitmq_management、アドレス http:// を入力します。ブラウザで localhost:15672 と入力し、管理インターフェイスに入ります。
  6. コードの記述

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート