国产av日韩一区二区三区精品,成人性爱视频在线观看,国产,欧美,日韩,一区,www.成色av久久成人,2222eeee成人天堂

ホームページ バックエンド開発 Golang Golang の RabbitMQ を使用した複數(shù)のメッセージ モードの比較と選択

Golang の RabbitMQ を使用した複數(shù)のメッセージ モードの比較と選択

Sep 28, 2023 pm 12:10 PM
golang rabbitmq メッセージパターン

Golang の RabbitMQ を使用した複數(shù)のメッセージ モードの比較と選択

Golang で RabbitMQ を使用した複數(shù)のメッセージ モードの比較と選択

はじめに:
分散システムでは、メッセージ キューは、メッセージ送信者とメッセージを分離するための一般的な通信メカニズムです。受信機(jī)と非同期通信を可能にします?,F(xiàn)在最も人気のあるメッセージ キューの 1 つである RabbitMQ は、開発者が選択できるさまざまなメッセージ モードを提供します。この記事では、RabbitMQ の 4 つの古典的なメッセージ モード、つまりシンプル キュー、ワーク キュー、パブリッシュ/サブスクライブ モード、およびトピック モードを比較し、それらの特性と適用可能なシナリオを分析し、Golang のサンプル コードを示します。

1. シンプル キュー (シンプル キュー)

シンプル キューは、コンシューマにメッセージを送信する RabbitMQ の最も基本的なメッセージ モードです。メッセージはキューに送信され、コンシューマーによって順番に読み取られます。

機(jī)能:

  1. メッセージは 1 人のコンシューマによってのみ使用できます。
  2. 同じキューをリッスンしている複數(shù)のコンシューマーがいる場(chǎng)合、メッセージは各コンシューマーに均等に配信されます。
  3. 処理速度が速い消費(fèi)者は、より多くのメッセージを消費(fèi)します。

該當(dāng)するシナリオ:

  1. ログ収集、タスク分散など、タスクまたはメッセージを複數(shù)のワークユニットに分散する必要があるアプリケーション シナリオ。

サンプル コード:

package main

import (
    "log"

    "github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
    if err != nil {
        log.Fatalf("%s: %s", msg, err)
    }
}

func main() {
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    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(
        "simple_queue",
        false,
        false,
        false,
        false,
        nil,
    )
    failOnError(err, "Failed to declare a queue")

    msgs, err := ch.Consume(
        q.Name,
        "",
        true,
        false,
        false,
        false,
        nil,
    )
    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)
        }
    }()

    log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
    <-forever
}

2. ワーク キュー (ワーク キュー)

ワーク キュー モードは、複數(shù)のコンシューマを介したメッセージの負(fù)荷分散メカニズムです。キュー內(nèi)のメッセージを処理します。ワークキューモードを使用すると、メッセージはキューに送信され、コンシューマによって順番に取得および処理されます。

機(jī)能:

  1. メッセージは 1 人のコンシューマによってのみ処理できます。
  2. 各コンシューマによって処理されるタスクは比較的均等です。つまり、処理速度が速いコンシューマはより多くのメッセージを処理します。

該當(dāng)するシナリオ:

  1. 畫像処理、ビデオ トランスコーディングなどのバックグラウンド タスク処理。

サンプル コード:

package main

import (
    "log"
    "os"
    "strconv"
    "strings"

    "github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
    if err != nil {
        log.Fatalf("%s: %s", msg, err)
    }
}

func main() {
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    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(
        "work_queue",
        true,
        false,
        false,
        false,
        nil,
    )
    failOnError(err, "Failed to declare a queue")

    body := bodyFrom(os.Args)
    err = ch.Publish(
        "",
        q.Name,
        false,
        false,
        amqp.Publishing{
            DeliveryMode: amqp.Persistent,
            ContentType:  "text/plain",
            Body:         []byte(body),
        })
    failOnError(err, "Failed to publish a message")

    log.Printf(" [x] Sent %s", body)
}

func bodyFrom(args []string) string {
    var s string
    if (len(args) < 2) || os.Args[1] == "" {
        s = "Hello, World!"
    } else {
        s = strings.Join(args[1:], " ")
    }
    return strconv.Itoa(os.Getpid()) + ":" + s
}

3. パブリッシュ/サブスクライブ モード (パブリッシュ/サブスクライブ)

パブリッシュ/サブスクライブ モードでは、メッセージはすべてのサブスクライバーにブロードキャストされます。 。すべての購(gòu)読者は同じメッセージを受信します。

特徴:

  1. 各メッセージはすべての購(gòu)読者にブロードキャストされます。
  2. サブスクライバが異なれば、メッセージ処理ロジックも異なる場(chǎng)合があります。

該當(dāng)するシナリオ:

  1. ログ ブロードキャスト、通知ブロードキャストなどのブロードキャスト メッセージ。

サンプル コード:

package main

import (
    "log"

    "github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
    if err != nil {
        log.Fatalf("%s: %s", msg, err)
    }
}

func main() {
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    failOnError(err, "Failed to connect to RabbitMQ")
    defer conn.Close()

    ch, err := conn.Channel()
    failOnError(err, "Failed to open a channel")
    defer ch.Close()

    err = ch.ExchangeDeclare(
        "logs",
        "fanout",
        true,
        false,
        false,
        false,
        nil,
    )
    failOnError(err, "Failed to declare an exchange")

    q, err := ch.QueueDeclare(
        "",
        false,
        false,
        true,
        false,
        nil,
    )
    failOnError(err, "Failed to declare a queue")

    err = ch.QueueBind(
        q.Name,
        "",
        "logs",
        false,
        nil,
    )
    failOnError(err, "Failed to bind a queue")

    msgs, err := ch.Consume(
        q.Name,
        "",
        true,
        false,
        false,
        false,
        nil,
    )
    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)
        }
    }()

    log.Printf(" [*] Waiting for messages. To exit press CTRL+C")
    <-forever
}

4. トピック モード (トピック)

トピック モードは、トピックのワイルドカード ルールを使用する、より複雑なメッセージ モードです。 to メッセージは、一致するトピックのサブスクライバーに送信されます。

機(jī)能:

  1. メッセージは、トピックの一致ルールに従ってルーティングされます。
  2. ワイルドカード形式でのトピックの一致をサポートします。
  3. さまざまな購(gòu)読者が、興味のあるトピックに応じて購(gòu)読できます。

該當(dāng)するシナリオ:

  1. トピックに基づいたメッセージのフィルタリングとルーティングが必要なシナリオ。

サンプル コード:

package main

import (
    "log"
    "os"

    "github.com/streadway/amqp"
)

func failOnError(err error, msg string) {
    if err != nil {
        log.Fatalf("%s: %s", msg, err)
    }
}

func main() {
    conn, err := amqp.Dial("amqp://guest:guest@localhost:5672/")
    failOnError(err, "Failed to connect to RabbitMQ")
    defer conn.Close()

    ch, err := conn.Channel()
    failOnError(err, "Failed to open a channel")
    defer ch.Close()

    err = ch.ExchangeDeclare(
        "direct_logs",
        "direct",
        true,
        false,
        false,
        false,
        nil,
    )
    failOnError(err, "Failed to declare an exchange")

    severity := severityFrom(os.Args)
    body := bodyFrom(os.Args)

    err = ch.Publish(
        "direct_logs",
        severity,
        false,
        false,
        amqp.Publishing{
            ContentType: "text/plain",
            Body:        []byte(body),
        },
    )
    failOnError(err, "Failed to publish a message")

    log.Printf(" [x] Sent %s", body)
}

func severityFrom(args []string) string {
    var severity string
    if len(args) < 3 || os.Args[2] == "" {
        severity = "info"
    } else {
        severity = os.Args[2]
    }
    return severity
}

func bodyFrom(args []string) string {
    var s string
    if len(args) < 4 || os.Args[3] == "" {
        s = "Hello, World!"
    } else {
        s = strings.Join(args[3:], " ")
    }
    return s
}

概要:
高性能メッセージ キュー システムとして、RabbitMQ にはさまざまなシナリオのニーズを満たす豊富なメッセージ モードがあります。実際のビジネス ニーズに応じて、対応するメッセージ モードを選択できます。この記事では、シンプル キュー、ワーク キュー、パブリッシュ/サブスクライブ モード、トピック モードの 4 つの典型的なメッセージ モードを比較し、対応する Golang サンプル コードを示します。開発者は、ニーズに基づいて適切なメッセージ モードを選択して分散システムを構(gòu)築できます。

以上がGolang の RabbitMQ を使用した複數(shù)のメッセージ モードの比較と選択の詳細(xì)內(nèi)容です。詳細(xì)については、PHP 中國(guó)語(yǔ) Web サイトの他の関連記事を參照してください。

このウェブサイトの聲明
この記事の內(nèi)容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰屬します。このサイトは、それに相當(dāng)する法的責(zé)任を負(fù)いません。盜作または侵害の疑いのあるコンテンツを見つけた場(chǎng)合は、admin@php.cn までご連絡(luò)ください。

ホットAIツール

Undress AI Tool

Undress AI Tool

脫衣畫像を無(wú)料で

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード寫真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

寫真から衣服を削除するオンライン AI ツール。

Clothoff.io

Clothoff.io

AI衣類リムーバー

Video Face Swap

Video Face Swap

完全無(wú)料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡(jiǎn)単に交換できます。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無(wú)料のコードエディター

SublimeText3 中國(guó)語(yǔ)版

SublimeText3 中國(guó)語(yǔ)版

中國(guó)語(yǔ)版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強(qiáng)力な PHP 統(tǒng)合開発環(huán)境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

Golang vs. C:パフォーマンスと速度の比較 Golang vs. C:パフォーマンスと速度の比較 Apr 21, 2025 am 12:13 AM

Golangは迅速な発展と同時(shí)シナリオに適しており、Cは極端なパフォーマンスと低レベルの制御が必要なシナリオに適しています。 1)Golangは、ごみ収集と並行機(jī)関のメカニズムを通じてパフォーマンスを向上させ、高配列Webサービス開発に適しています。 2)Cは、手動(dòng)のメモリ管理とコンパイラの最適化を通じて究極のパフォーマンスを?qū)g現(xiàn)し、埋め込みシステム開発に適しています。

Golang and C:Concurrency vs. Raw Speed Golang and C:Concurrency vs. Raw Speed Apr 21, 2025 am 12:16 AM

Golangは並行性がCよりも優(yōu)れていますが、Cは生の速度ではGolangよりも優(yōu)れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達(dá)成します。これは、多數(shù)の同時(shí)タスクの処理に適しています。 2)Cコンパイラの最適化と標(biāo)準(zhǔn)ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

GOのどのライブラリが大企業(yè)によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? GOのどのライブラリが大企業(yè)によって開発されていますか、それとも有名なオープンソースプロジェクトによって提供されていますか? Apr 02, 2025 pm 04:12 PM

大企業(yè)または有名なオープンソースプロジェクトによって開発されたGOのどのライブラリが開発されていますか? GOでプログラミングするとき、開発者はしばしばいくつかの一般的なニーズに遭遇します...

Golang vs. Python:パフォーマンスとスケーラビリティ Golang vs. Python:パフォーマンスとスケーラビリティ Apr 19, 2025 am 12:18 AM

Golangは、パフォーマンスとスケーラビリティの點(diǎn)でPythonよりも優(yōu)れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機(jī)能します。 2)Pythonは解釈された言語(yǔ)として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

Golangの目的:効率的でスケーラブルなシステムの構(gòu)築 Golangの目的:効率的でスケーラブルなシステムの構(gòu)築 Apr 09, 2025 pm 05:17 PM

GO言語(yǔ)は、効率的でスケーラブルなシステムの構(gòu)築においてうまく機(jī)能します。その利點(diǎn)には次のものがあります。1。高性能:マシンコードにコンパイルされ、速度速度が速い。 2。同時(shí)プログラミング:ゴルチンとチャネルを介してマルチタスクを簡(jiǎn)素化します。 3。シンプルさ:簡(jiǎn)潔な構(gòu)文、學(xué)習(xí)コストとメンテナンスコストの削減。 4。クロスプラットフォーム:クロスプラットフォームのコンパイル、簡(jiǎn)単な展開をサポートします。

Golang vs. Python:重要な違??いと類似點(diǎn) Golang vs. Python:重要な違??いと類似點(diǎn) Apr 17, 2025 am 12:15 AM

GolangとPythonにはそれぞれ獨(dú)自の利點(diǎn)があります。Golangは高性能と同時(shí)プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時(shí)性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡(jiǎn)潔な構(gòu)文とリッチライブラリエコシステムで知られています。

CとGolang:パフォーマンスが重要な場(chǎng)合 CとGolang:パフォーマンスが重要な場(chǎng)合 Apr 13, 2025 am 12:11 AM

Cは、ハードウェアリソースと高性能の最適化が必要なシナリオにより適していますが、Golangは迅速な開発と高い並行性処理が必要なシナリオにより適しています。 1.Cの利點(diǎn)は、ハードウェア特性と高い最適化機(jī)能に近いものにあります。これは、ゲーム開発などの高性能ニーズに適しています。 2.Golangの利點(diǎn)は、その簡(jiǎn)潔な構(gòu)文と自然な並行性サポートにあり、これは高い並行性サービス開発に適しています。

Golang vs. Python:並行性とマルチスレッド Golang vs. Python:並行性とマルチスレッド Apr 17, 2025 am 12:20 AM

Golangは高い並行性タスクにより適していますが、Pythonには柔軟性がより多くの利點(diǎn)があります。 1.Golangは、GoroutineとChannelを介して並行性を効率的に処理します。 2。Pythonは、GILの影響を受けるが、複數(shù)の並行性メソッドを提供するスレッドとAsyncioに依存しています。選択は、特定のニーズに基づいている必要があります。

See all articles