ActiveMQ、RabbitMQ、Kafka、RocketMQ メッセージ ミドルウェア テクノロジの選択


メッセージミドルウェアは分散システムにおける重要なコンポーネントの 1 つであり、非同期通信を実現し、システムを分離し、システムの信頼性と拡張性を向上させるために使用されます。メッセージング ミドルウェア テクノロジを選択する場合は、信頼性、パフォーマンス、スケーラビリティ、機能の豊富さ、コミュニティ サポート、コストなどの複数の要素を考慮する必要があります。この記事では、ActiveMQ、RabbitMQ、Kafka、RocketMQ、ZeroMQ という 5 つの一般的なメッセージング ミドルウェア テクノロジについて説明します。

アクティブMQ

ActiveMQ は、Apache Software Foundation によって開発および保守されているオープン ソースの Java ベースのメッセージング ミドルウェアです。これは、信頼性の高いメッセージング メカニズムを提供する Java Message Service (JMS) API を実装しています。ActiveMQ は、さまざまな伝送プロトコルとメッセージ モードをサポートし、信頼性、高性能、拡張性の特徴を備えています。

機能と利点

  1. 信頼性: ActiveMQ は、送受信中のメッセージの信頼性を確保するための永続化メカニズムを提供します。ロギングとメッセージ ストレージを使用してメッセージの信頼性の高い配信を保証し、トランザクション処理をサポートしてメッセージの一貫性を確保します。

  2. ハイパフォーマンス: ActiveMQ は、非同期メッセージングと最適化されたネットワーク通信プロトコルを使用して、高スループットと低遅延を実現します。マルチスレッドを使用してメッセージを処理し、効率的なメッセージ配信メカニズムを提供します。

  3. スケーラビリティ: ActiveMQ はクラスターと分散デプロイメントをサポートしており、メッセージ ブローカー ノードを追加することで水平方向の拡張を実現できます。また、動的ルーティングと負荷分散もサポートしており、システムが多数の同時リクエストを処理できるようになります。

  4. 豊富な機能: ActiveMQ は、メッセージ永続化、メッセージ セレクター、メッセージ フィルター、メッセージ リスナー、メッセージ ルーティングなど、さまざまな高度な機能とモードを提供します。ポイントツーポイント モードとパブリッシュ/サブスクライブ モードをサポートしており、さまざまなシナリオのニーズを満たすことができます。

  5. 多言語サポート: ActiveMQ は、Java、C、C++、Python などを含むさまざまなプログラミング言語と統合でき、開発者が使用できるさまざまなクライアント API とプロトコルを提供します。

ActiveMQ アプリケーションのシナリオ

  • エンタープライズ アプリケーションの統合: ActiveMQ を使用すると、異なるアプリケーション間で信頼性の高いメッセージ配信を行い、システム間の統合と通信を実現できます。

  • 分散システム: ActiveMQ のスケーラビリティと高いパフォーマンスにより、多数のメッセージと同時リクエストを処理する大規模な分散システムの構築に適しています。

  • 非同期通信: ActiveMQ の非同期メッセージング メカニズムにより、システムの応答パフォーマンスが向上し、アプリケーションが非同期で通信および処理できるようになります。

  • イベント駆動型アーキテクチャ: ActiveMQ のパブリッシュ/サブスクライブ モデルとメッセージ リスナーを使用してイベント駆動型アーキテクチャを実装し、システムのさまざまなコンポーネントを分離し、疎結合を実現できます。

ActiveMQ はメッセージの送受信を実装します。

import javax.jms.*;

public class ActiveMQExample {
    
    
    public static void main(String[] args) {
    
    
        try {
    
    
            // 创建连接工厂
            ConnectionFactory factory = new org.apache.activemq

.ActiveMQConnectionFactory("tcp://localhost:61616");

            // 创建连接
            Connection connection = factory.createConnection();

            // 启动连接
            connection.start();

            // 创建会话
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            // 创建目标队列
            Destination destination = session.createQueue("myQueue");

            // 创建生产者
            MessageProducer producer = session.createProducer(destination);

            // 创建消息
            TextMessage message = session.createTextMessage("Hello, ActiveMQ!");

            // 发送消息
            producer.send(message);
            System.out.println("消息发送成功");

            // 创建消费者
            MessageConsumer consumer = session.createConsumer(destination);

            // 接收消息
            Message receivedMessage = consumer.receive();
            if (receivedMessage instanceof TextMessage) {
    
    
                TextMessage textMessage = (TextMessage) receivedMessage;
                System.out.println("接收到的消息: " + textMessage.getText());
            }

            // 关闭连接
            session.close();
            connection.close();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }
}

まず接続ファクトリーと接続を作成し、接続を開始します。次に、セッションとターゲット キューを作成します。次に、プロデューサーを作成し、テキスト メッセージを送信します。コンシューマを作成し、メッセージを受信します。最後に、セッションと接続が閉じられます。

ラビットMQ

RabbitMQ は、Rabbit Technologies によって開発および保守されているオープン ソースの AMQP (Advanced Message Queuing Protocol) ベースのメッセージング ミドルウェアです。RabbitMQ は、信頼性の高いメッセージ配信メカニズムを提供し、複数のメッセージ モードと高度な機能をサポートし、柔軟性、信頼性、拡張性に優れています。

機能と利点

  1. 信頼性: RabbitMQ は、パブリッシュ/サブスクライブ モデルと確認応答メカニズムを使用して、メッセージの信頼性の高い配信を保証します。メッセージをディスクに保存する永続化メカニズムを提供するため、サーバーの障害や再起動の後でもメッセージを復元できます。

  2. 柔軟性: RabbitMQ は、ポイントツーポイント モード、パブリッシュ/サブスクライブ モード、リクエスト/レスポンス モードを含む複数のメッセージ モードをサポートします。また、メッセージ選択サブスクリプション、メッセージ フィルタリング、メッセージ優先度などの高度な機能もサポートしており、アプリケーション要件に応じて柔軟に構成できます。

  3. スケーラビリティ: RabbitMQ はノードを追加することでクラスタおよび分散展開を実現できるため、システムのスケーラビリティとフォールト トレランスが向上します。動的ルーティングと負荷分散をサポートし、大量のメッセージと同時リクエストを処理できます。

  4. 多言語サポート: RabbitMQ は、開発者の利便性を考慮して、さまざまなクライアント ライブラリと API を提供し、Java、Python、Ruby、JavaScript などの複数のプログラミング言語をサポートします。

  5. 管理インターフェイス: RabbitMQ は、メッセージ キュー、スイッチ、バインディングなどを監視および管理できる使いやすい管理インターフェイスを提供し、構成と調整を容易にします。

RabbitMQ が適用されるシナリオ

  • 非同期タスク処理: RabbitMQ を使用すると、タスクを複数のワーカー (コンシューマ) に分散し、非同期タスク処理を実現し、システムの同時実行性と応答速度を向上させることができます。

  • メッセージ通知: RabbitMQ を使用して、システム イベント、ステータス更新などのメッセージ通知を送信したり、サブスクライバーにメッセージをプッシュしたりして、リアルタイム通知とプッシュ機能を実現できます。

  • ログ収集: RabbitMQ はログの収集と配布に使用でき、指定されたコンシューマにログ メッセージを送信し、集中的なログ管理と分析を実現します。

  • システム コンポーネントの分離: RabbitMQ のパブリッシュ/サブスクライブ モデルとメッセージ ルーティング メカニズムを使用して、システムのさまざまなコンポーネントを分離し、疎結合と柔軟なアーキテクチャ設計を実現できます。

RabbitMQ はメッセージの送受信を実装します

import com.rabbitmq.client.Channel;
import com.rabbitmq.client.Connection;
import com.rabbitmq.client.ConnectionFactory;
import com.rabbitmq.client.QueueingConsumer;

public class RabbitMQExample {
    
    
    private final static String QUEUE_NAME = "myQueue";

    public static void main(String[] args) {
    
    
        try {
    
    
            // 创建连接工厂
            ConnectionFactory factory = new ConnectionFactory();
            factory.setHost("localhost");

            // 创建连接
            Connection connection = factory.newConnection();

            // 创建通道
            Channel channel = connection.createChannel();

            // 声明队列
            channel.queueDeclare(QUEUE_NAME, false, false, false, null);

            // 发送消息
            String message = "Hello, RabbitMQ!";
            channel.basicPublish("", QUEUE_NAME, null, message.getBytes());
            System.out.println("消息发送成功");

            // 创建消费者
            QueueingConsumer consumer = new QueueingConsumer(channel);
            channel.basicConsume(QUEUE_NAME, true, consumer);

            // 接收消息
            QueueingConsumer.Delivery delivery = consumer.nextDelivery();
            String receivedMessage = new String(delivery.getBody());
            System.out.println("接收到的消息: " + receivedMessage);

            // 关闭通道和连接
            channel.close();
            connection.close();
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }
}

まず接続ファクトリーと接続を作成し、ホスト名を設定します。次に、チャネルを作成し、キューを宣言します。次に、basicPublish メソッドを使用して、指定されたキューにメッセージを送信します。コンシューマを作成し、メッセージを受信します。最後に、チャネルと接続が閉じられます。

カフカ

Kafka は、Apache Software Foundation によって開発および保守されている、分散型、高性能、スケーラブルなメッセージング ミドルウェアです。パブリッシュ/サブスクライブ モデルに基づいており、効率的なログ ストレージとパーティション メカニズムを使用して、信頼性の高いメッセージ配信とリアルタイムのデータ ストリーム処理機能を提供します。

機能と利点

  1. 高スループット: Kafka は、シーケンシャル ディスク アクセスやバッチ メッセージ処理などの技術を使用して、高スループットのメッセージ配信を実現します。大規模なメッセージ ストリームを処理でき、1 秒あたり数百万のメッセージの処理能力をサポートします。

  2. スケーラビリティ: Kafka は優れたスケーラビリティを備えており、ノードを追加することでクラスタおよび分散デプロイメントを実現できます。動的なパーティション割り当てと自動負荷分散をサポートし、多数の同時リクエストを処理できます。

  3. 永続性: Kafka は永続的なログ ストレージを使用して、メッセージの信頼性の高い配信を保証します。すべてのメッセージをディスクに書き込み、サーバー障害や再起動後でもメッセージの永続化と回復をサポートします。

  4. リアルタイム データ処理: Kafka にはリアルタイム データ ストリーム処理機能があり、ストリーム処理フレームワーク (Apache Spark や Apache Flink など) の統合をサポートしています。大規模なデータ ストリームをリアルタイムで処理および分析でき、低遅延のデータ処理をサポートします。

  5. 多言語サポート: Kafka は、開発者の利便性を考慮して、さまざまなクライアント ライブラリと API を提供し、Java、Python、Go などの複数のプログラミング言語をサポートします。

Kafka の適用可能なシナリオ

  • ログ収集: Kafka を使用して大量のログ データを収集および送信し、一元的なログ管理と分析を実現できます。複数のデータ ソースからのログを処理でき、データの永続化とリアルタイム処理をサポートします。

  • イベント駆動型アーキテクチャ: Kafka のパブリッシュ/サブスクライブ モードとパーティション メカニズムを使用してイベント駆動型アーキテクチャを実装し、システムのさまざまなコンポーネントを分離し、疎結合を実現できます。高スループットおよび低遅延のイベント処理をサポートします。

  • リアルタイム データ処理: Kafka のリアルタイム データ ストリーム処理機能は、ビッグ データ処理とリアルタイム分析に最適です。大規模なデータ ストリームを処理でき、リアルタイムのデータ処理と計算をサポートします。

  • メッセージング: Kafka は、異なるアプリケーション間の信頼性の高いメッセージングに使用でき、システム間の統合と通信を可能にします。複数のコンシューマ グループとメッセージの永続性をサポートし、メッセージの信頼性の高い配信を保証します。

Kafka はメッセージの送受信を実装します

import org.apache.kafka.clients.producer.*;
import org.apache.kafka.clients.consumer.*;

import java.util.Properties;
import java.util.Arrays;

public class KafkaExample {
    
    
    private final static String TOPIC = "myTopic";

    public static void main(String[] args) {
    
    
        try {
    
    
            //

 创建生产者配置
            Properties producerProps = new Properties();
            producerProps.put("bootstrap.servers", "localhost:9092");
            producerProps.put("key.serializer", "org.apache.kafka.common.serialization.StringSerializer");
            producerProps.put("value.serializer", "org.apache.kafka.common.serialization.StringSerializer");

            // 创建生产者
            Producer<String, String> producer = new KafkaProducer<>(producerProps);

            // 创建消息
            String message = "Hello, Kafka!";
            ProducerRecord<String, String> record = new ProducerRecord<>(TOPIC, message);

            // 发送消息
            producer.send(record, new Callback() {
    
    
                @Override
                public void onCompletion(RecordMetadata metadata, Exception exception) {
    
    
                    if (exception != null) {
    
    
                        exception.printStackTrace();
                    } else {
    
    
                        System.out.println("消息发送成功,偏移量:" + metadata.offset());
                    }
                }
            });

            // 关闭生产者
            producer.close();

            // 创建消费者配置
            Properties consumerProps = new Properties();
            consumerProps.put("bootstrap.servers", "localhost:9092");
            consumerProps.put("group.id", "myGroup");
            consumerProps.put("key.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");
            consumerProps.put("value.deserializer", "org.apache.kafka.common.serialization.StringDeserializer");

            // 创建消费者
            Consumer<String, String> consumer = new KafkaConsumer<>(consumerProps);

            // 订阅主题
            consumer.subscribe(Arrays.asList(TOPIC));

            // 接收消息
            while (true) {
    
    
                ConsumerRecords<String, String> records = consumer.poll(100);
                for (ConsumerRecord<String, String> record : records) {
    
    
                    System.out.println("接收到的消息:" + record.value());
                }
            }
        } catch (Exception e) {
    
    
            e.printStackTrace();
        }
    }
}

まず、プロデューサー構成とプロデューサーを作成し、サーバー アドレスとシリアライザーを設定します。次に、メッセージと録音を作成し、指定されたトピックにメッセージを送信します。コンシューマ構成とコンシューマを作成し、指定されたトピックをサブスクライブします。ポーリング メソッドを使用して、受信したメッセージをポーリングし、処理します。最後に、プロデューサーとコンシューマーを閉じます。

ロケットMQ

RocketMQ は、Alibaba Group によって開発されたオープンソースのメッセージ ミドルウェアであり、高スループット、低遅延、高信頼性、拡張性の特徴を備えています。RocketMQ は分散展開と水平拡張をサポートしており、大規模な分散システムやリアルタイム データ処理に適しています。

機能と利点

  1. 高スループットと低遅延: RocketMQ は、最適化されたストレージ構造と効率的なネットワーク伝送プロトコルを通じて、高スループットと低遅延のメッセージ配信を実現します。1 秒あたり数百万のメッセージを処理でき、ミリ秒単位のメッセージ配信遅延をサポートします。

  2. 信頼性: RocketMQ は、信頼性の高いメッセージ配信を保証します。マスター/スレーブ レプリケーションを使用します

そして、送受信の過程でメッセージの信頼性を確保するためのメッセージ ブラッシング メカニズム。また、メッセージの永続化と再試行メカニズムもサポートしているため、サーバーの障害や再起動の後でもメッセージを復元できます。

  1. スケーラビリティ: RocketMQ は分散展開と水平拡張をサポートします。エージェント (Broker) とネーミング サーバー (NameServer) を追加することでクラスタリングとパーティショニングを実装でき、それによってシステムのスケーラビリティとフォールト トレランスが向上します。

  2. 豊富な機能: RocketMQ は豊富な機能と高度な機能を提供します。ポイントツーポイントやパブリッシュ/サブスクライブなど、複数のメッセージング パターンをサポートします。また、連続メッセージ、遅延メッセージ、トランザクション メッセージなどの高度な機能もサポートしており、アプリケーションの要件に応じて柔軟に構成できます。

  3. 監視と管理: RocketMQ は、メッセージの送受信をリアルタイムで監視し、メッセージのステータスと統計情報を表示し、クラスターを管理および最適化できる、使いやすい監視および管理ツールを提供します。

RocketMQ が適用されるシナリオ

  • 分散システム: RocketMQ は大規模な分散システムに適しており、システム間のメッセージ通信やデータ同期に使用できます。信頼性の高いメッセージング メカニズムと高スループットのパフォーマンスを提供し、システムの高い同時実行性と高い信頼性の要件をサポートします。

  • リアルタイム データ処理: RocketMQ の低レイテンシーと高スループット特性により、リアルタイム データ処理とストリーミング コンピューティングに最適です。大規模なデータ ストリームを処理でき、リアルタイムのデータ処理と計算をサポートします。

  • ログ収集: RocketMQ は大規模なログ収集と分析に使用でき、さまざまなノードに分散されたログ情報を中央ノードに収集して処理と分析を行います。高スループットのログ配布と永続ストレージをサポートします。

  • メッセージ プッシュ: RocketMQ を使用して、プッシュ システム イベント、ユーザー通知などのメッセージ プッシュおよび通知機能を実装できます。ブロードキャスト モードと選択的サブスクリプションをサポートし、要求に応じて指定されたユーザーまたはサブスクライバーにメッセージをプッシュできます。

RocketMQ はメッセージの送受信を実装します

import org.apache.rocketmq.client.producer.DefaultMQProducer;
import org.apache.rocketmq.common.message.Message;
import org.apache.rocketmq.client.consumer.DefaultMQPushConsumer;
import org.apache.rocketmq.client.consumer.listener.MessageListenerConcurrently;
import org.apache.rocketmq.client.consumer.listener.ConsumeConcurrentlyContext;
import org.apache.rocketmq.common.message.MessageExt;
import org.apache.rocketmq.client.exception.MQClientException;

import java.util.List;

public class RocketMQExample {
    
    
    private final static String TOPIC = "myTopic";
    private final static String PRODUCER_GROUP = "myProducerGroup";
    private final static String CON

SUMER_GROUP = "myConsumerGroup";

    public static void main(String[] args) {
    
    
        try {
    
    
            // 创建生产者
            DefaultMQProducer producer = new DefaultMQProducer(PRODUCER_GROUP);
            producer.setNamesrvAddr("localhost:9876");
            producer.start();

            // 发送消息
            String message = "Hello, RocketMQ!";
            Message msg = new Message(TOPIC, message.getBytes());
            producer.send(msg);
            System.out.println("消息发送成功");

            // 关闭生产者
            producer.shutdown();

            // 创建消费者
            DefaultMQPushConsumer consumer = new DefaultMQPushConsumer(CONSUMER_GROUP);
            consumer.setNamesrvAddr("localhost:9876");
            consumer.subscribe(TOPIC, "*");
            consumer.registerMessageListener(new MessageListenerConcurrently() {
    
    
                @Override
                public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> messages, ConsumeConcurrentlyContext context) {
    
    
                    for (MessageExt message : messages) {
    
    
                        System.out.println("接收到的消息:" + new String(message.getBody()));
                    }
                    return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
                }
            });
            consumer.start();

            // 等待一段时间后关闭消费者
            Thread.sleep(5000);
            consumer.shutdown();
        } catch (MQClientException | InterruptedException e) {
    
    
            e.printStackTrace();
        }
    }
}

まずプロデューサーを作成し、プロデューサー グループとネームサーバーのアドレスを設定します。次に、メッセージが作成され、指定されたトピックに送信されます。次に、プロデューサーをシャットダウンします。コンシューマを作成し、コンシューマ グループとネームサーバーのアドレスを設定します。次に、トピックを購読してメッセージ リスナーを登録し、受信したメッセージをリスナーで処理します。コンシューマを起動し、しばらく待ってからコンシューマを閉じます。

ActiveMQ、RabbitMQ、Kafka、RocketMQ の総合比較

信頼性
ActiveMQ、RabbitMQ、Kafka、RocketMQ、および ZeroMQ はすべて、さまざまな実装とメカニズムで信頼性の高いメッセージングを提供します。選択する場合は、システムの信頼性要件に従って評価する必要があります。

パフォーマンス
Kafka と RocketMQ は、大規模なデータ処理に適した、高スループットと低遅延に重点を置いたメッセージング ミドルウェアです。ActiveMQ、RabbitMQ、ZeroMQ もパフォーマンスの点では優れていますが、Kafka や RocketMQ にはわずかに遅れています。

スケーラビリティ
Kafka および RocketMQ は、優れたスケーラビリティと水平拡張機能を備えた分散メッセージ ミドルウェアです。ActiveMQ、RabbitMQ、ZeroMQ もある程度の拡張をサポートしていますが、Kafka や RocketMQ の分散アーキテクチャと比較すると拡張性が低くなります。

機能の豊富さ
RabbitMQ と Kafka は機能が非常に豊富で、メッセージの確認、永続化、パブリッシュ/サブスクライブ、メッセージ ルーティングなど、さまざまな高度な機能とパターンを提供します。ActiveMQ、RocketMQ、ZeroMQ も多くの機能を提供しますが、RabbitMQ や Kafka に比べて若干簡素化されています。

コミュニティ サポート
ActiveMQ、RabbitMQ、Kafka、RocketMQ、および ZeroMQ はすべてアクティブなコミュニティ サポートを備えており、豊富なドキュメント、例、コミュニティ ディスカッションを提供します。これは開発とトラブルシューティングにとって非常に重要です。

プロジェクトの要件と特定のシナリオに応じて、上記の比較に基づいて最適なメッセージ ミドルウェア テクノロジを選択できます。

おすすめ

転載: blog.csdn.net/weixin_43749805/article/details/131323363