当前位置: 首页 > news >正文

开源消息队列比较

目录

1. Apache Kafka

1.1安装步骤

1.1.1使用Docker安装

1.1.1手动安装

1.2 C#使用示例代码

1.2.1 安装Confluent.Kafka

1.2.2生产者代码示例

1.2.3消费者代码示例

1.3特点

1.4使用场景

2. RabbitMQ

2.1安装步骤

2.1.1使用Docker安装

2.1.2手动安装

2.2 C#使用示例代码

2.2.1安装RabbitMQ.Client

2.2.2生产者代码示例

2.2.3消费者代码示例

2.3特点

2.4使用场景

3. Apache ActiveMQ

3.1安装步骤

3.1.1使用Docker安装

3.1.2手动安装

3.2 C#使用示例代码

3.2.1安装Apache.NMS.ActiveMQ

3.2.2生产者代码示例

3.2.3消费者代码示例

3.3特点

3.4使用场景

4. Redis (with Redis Streams)

4.1安装步骤

4.1.1使用Docker安装

4.1.2手动安装

4.2 C#使用示例代码

4.2.1安装StackExchange.Redis

4.2.2生产者代码示例

4.2.3消费者代码示例

4.3特点

4.4使用场景

5. NATS

5.1安装步骤

5.1.1使用Docker安装

5.1.2手动安装

5.2 C#使用示例代码

5.2.1安装NATS.Client

5.2.2生产者代码示例

5.2.3消费者代码示例

5.3特点

5.4使用场景

6. Apache Pulsar

6.1安装步骤

6.1.1使用Docker安装

6.1.2手动安装

6.2 C#使用示例代码

6.2.1安装Pulsar.Client.Api

6.2.2生产者代码示例

6.2.3消费者代码示例

6.3特点

6.4使用场景

7. ZeroMQ

7.1安装步骤

7.1.1使用Docker安装

7.1.2手动安装

7.2 C#使用示例代码

7.2.1安装NetMQ

7.2.2生产者代码示例

7.2.3消费者代码示例

7.3特点

7.4使用场景

8. Apache RocketMQ

8.1安装步骤

8.1.1使用Docker安装

8.1.2手动安装

8.2 C#使用示例代码

8.2.1安装RocketMQ.Client

8.2.2生产者代码示例

8.2.3消费者代码示例

8.3特点

8.4使用场景

9. NSQ

9.1安装步骤

9.1.1使用Docker安装

9.1.2手动安装

9.2 C#使用示例代码

9.2.1安装NsqSharp

9.2.2生产者代码示例

9.2.3消费者代码示例

9.3特点

9.4使用场景

10. Kafka Streams

10.1安装步骤

10.2 C#使用示例代码

10.3特点

10.4使用场景

11.特点对比

12.使用场景对比

13.选型策略


1. Apache Kafka

1.1安装步骤

1.1.1使用Docker安装

docker-compose.yml:

version: '2'

services:

  zookeeper:

    image: wurstmeister/zookeeper:3.4.6

    ports:

     - "2181:2181"

  kafka:

    image: wurstmeister/kafka:2.12-2.3.0

    ports:

     - "9092:9092"

    environment:

      KAFKA_ADVERTISED_LISTENERS: PLAINTEXT://localhost:9092

      KAFKA_ZOOKEEPER_CONNECT: zookeeper:2181

    volumes:

     - /var/run/docker.sock:/var/run/docker.sock

1.1.1手动安装

下载Kafka二进制文件:

wget https://downloads.apache.org/kafka/2.8.0/kafka_2.13-2.8.0.tgz

解压文件并进入目录:tar -xzf kafka_2.13-2.8.0.tgzcd kafka_2.13-2.8.0

启动Zookeeper:

bin/zookeeper-server-start.sh config/zookeeper.properties

启动Kafka服务器:

bin/kafka-server-start.sh config/server.properties

1.2 C#使用示例代码

1.2.1 安装Confluent.Kafka

在你的C#项目中安装Confluent.Kafka包:

dotnet add package Confluent.Kafka

1.2.2生产者代码示例

using Confluent.Kafka;using System;using System.Threading.Tasks;

class Program

{

    public static async Task Main(string[] args)

    {

        var config = new ProducerConfig { BootstrapServers = "localhost:9092" };

        using (var producer = new ProducerBuilder<Null, string>(config).Build())

        {

            try

            {

                var deliveryResult = await producer.ProduceAsync("test-topic", new Message<Null, string> { Value = "Hello Kafka" });

                Console.WriteLine($"Delivered '{deliveryResult.Value}' to '{deliveryResult.TopicPartitionOffset}'");

            }

            catch (ProduceException<Null, string> e)

            {

                Console.WriteLine($"Delivery failed: {e.Error.Reason}");

            }

        }

    }

}

1.2.3消费者代码示例

using Confluent.Kafka;using System;using System.Threading;

class Program

{

    public static void Main(string[] args)

    {

        var config = new ConsumerConfig

        {

            GroupId = "test-consumer-group",

            BootstrapServers = "localhost:9092",

            AutoOffsetReset = AutoOffsetReset.Earliest

        };

        using (var consumer = new ConsumerBuilder<Null, string>(config).Build())

        {

            consumer.Subscribe("test-topic");

            try

            {

                while (true)

                {

                    var consumeResult = consumer.Consume(CancellationToken.None);

                    Console.WriteLine($"Consumed message '{consumeResult.Message.Value}' at: '{consumeResult.TopicPartitionOffset}'.");

                }

            }

            catch (OperationCanceledException)

            {

                consumer.Close();

            }

        }

    }

}

1.3特点

  • 高吞吐量:适合处理大量数据流。
  • 分布式架构:易于扩展和容错。
  • 持久化:消息存储在磁盘上,保证数据安全。

1.4使用场景

  • 日志收集与分析。
  • 大数据管道。
  • 实时流处理。

2. RabbitMQ

2.1安装步骤

2.1.1使用Docker安装

docker run -d --name rabbitmq -p 5672:5672 -p 15672:15672 rabbitmq:3-management

2.1.2手动安装

下载RabbitMQ:

wget https://github.com/rabbitmq/rabbitmq-server/releases/download/v3.8.16/rabbitmq-server-generic-unix-3.8.16.tar.xz

解压文件并进入目录:

tar -xvf rabbitmq-server-generic-unix-3.8.16.tar.xz

cd rabbitmq_server-3.8.16/sbin

启动RabbitMQ:

./rabbitmq-server

2.2 C#使用示例代码

2.2.1安装RabbitMQ.Client

在你的C#项目中安装RabbitMQ.Client包:

dotnet add package RabbitMQ.Client

2.2.2生产者代码示例

using RabbitMQ.Client;using System;using System.Text;

class Program

{

    public static void Main()

    {

        var factory = new ConnectionFactory() { HostName = "localhost" };

        using (var connection = factory.CreateConnection())

        using (var channel = connection.CreateModel())

        {

            channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null);

            string message = "Hello RabbitMQ";

            var body = Encoding.UTF8.GetBytes(message);

            channel.BasicPublish(exchange: "", routingKey: "hello", basicProperties: null, body: body);

            Console.WriteLine($" [x] Sent {message}");

        }

    }

}

2.2.3消费者代码示例

using RabbitMQ.Client;using RabbitMQ.Client.Events;using System;using System.Text;

class Program

{

    public static void Main()

    {

        var factory = new ConnectionFactory() { HostName = "localhost" };

        using (var connection = factory.CreateConnection())

        using (var channel = connection.CreateModel())

        {

            channel.QueueDeclare(queue: "hello", durable: false, exclusive: false, autoDelete: false, arguments: null);

            var consumer = new EventingBasicConsumer(channel);

            consumer.Received += (model, ea) =>

            {

                var body = ea.Body.ToArray();

                var message = Encoding.UTF8.GetString(body);

                Console.WriteLine($" [x] Received {message}");

            };

            channel.BasicConsume(queue: "hello", autoAck: true, consumer: consumer);

            Console.WriteLine(" Press [enter] to exit.");

            Console.ReadLine();

        }

    }

}

2.3特点

  • 可靠性:支持持久化、消息确认和发布确认。
  • 灵活的路由:支持多种交换类型(direct、topic、headers和fanout)。
  • 插件系统:可扩展功能。

2.4使用场景

  • 异步任务处理。
  • 实时消息传递。
  • 微服务通信。

3. Apache ActiveMQ

3.1安装步骤

3.1.1使用Docker安装

docker run -d --name activemq -p 61616:61616 -p 8161:8161 rmohr/activemq

3.1.2手动安装

下载ActiveMQ:

wget https://archive.apache.org/dist/activemq/5.16.3/apache-activemq-5.16.3-bin.tar.gz

解压文件并进入目录:

tar -xzf apache-activemq-5.16.3-bin.tar.gzcd apache-activemq-5.16.3

启动ActiveMQ:

./bin/activemq start

3.2 C#使用示例代码

3.2.1安装Apache.NMS.ActiveMQ

在你的C#项目中安装Apache.NMS.ActiveMQ包:

dotnet add package Apache.NMS.ActiveMQ

3.2.2生产者代码示例

using Apache.NMS;using Apache.NMS.ActiveMQ;using System;

class Program

{

    public static void Main()

    {

        IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616");

        using (IConnection connection = factory.CreateConnection())

        using (ISession session = connection.CreateSession())

        {

            IDestination destination = session.GetQueue("test-queue");

            using (IMessageProducer producer = session.CreateProducer(destination))

            {

                ITextMessage message = producer.CreateTextMessage("Hello ActiveMQ");

                producer.Send(message);

                Console.WriteLine($"Sent: {message.Text}");

            }

        }

    }

}

3.2.3消费者代码示例

using Apache.NMS;using Apache.NMS.ActiveMQ;using System;

class Program

{

    public static void Main()

    {

        IConnectionFactory factory = new ConnectionFactory("tcp://localhost:61616");

        using (IConnection connection = factory.CreateConnection())

        using (ISession session = connection.CreateSession())

        {

            IDestination destination = session.GetQueue("test-queue");

            using (IMessageConsumer consumer = session.CreateConsumer(destination))

            {

                connection.Start();

                IMessage message = consumer.Receive();

                if (message is ITextMessage)

                {

                    var textMessage = (ITextMessage)message;

                    Console.WriteLine($"Received: {textMessage.Text}");

                }

            }

        }

    }

}

3.3特点

  • 兼容性:支持JMS 1.1和J2EE 1.4规范。
  • 多协议支持:支持AMQP、MQTT、OpenWire、STOMP等。
  • 高可用性:支持Master/Slave集群和高可用性配置。

3.4使用场景

  • 企业级应用集成。
  • 消息驱动的微服务。
  • 事件驱动架构。

4. Redis (with Redis Streams)

4.1安装步骤

4.1.1使用Docker安装

docker run -d --name redis -p 6379:6379 redis

4.1.2手动安装

下载Redis:wget http://download.redis.io/releases/redis-6.2.6.tar.gz

解压文件并进入目录:

tar -xzf redis-6.2.6.tar.gzcd redis-6.2.6

编译Redis:

make

启动Redis:

src/redis-server

4.2 C#使用示例代码

4.2.1安装StackExchange.Redis

在你的C#项目中安装StackExchange.Redis包:

dotnet add package StackExchange.Redis

4.2.2生产者代码示例

using StackExchange.Redis;using System;

class Program

{

    static void Main(string[] args)

    {

        ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");

        IDatabase db = redis.GetDatabase();

        db.StreamAdd("mystream", "message", "Hello Redis Streams");

        Console.WriteLine("Message added to stream");

    }

}

4.2.3消费者代码示例

using StackExchange.Redis;using System;

class Program

{

    static void Main(string[] args)

    {

        ConnectionMultiplexer redis = ConnectionMultiplexer.Connect("localhost");

        IDatabase db = redis.GetDatabase();

        var entries = db.StreamRead("mystream", "0-0");

        foreach (var entry in entries)

        {

            Console.WriteLine($"ID: {entry.Id}, Message: {entry["message"]}");

        }

    }

}

4.3特点

  • 内存存储:极低的延迟。
  • 数据结构丰富:支持字符串、哈希、列表、集合、有序集合、位图、HyperLogLog、Streams等。
  • 高可用性:通过Redis Sentinel和Redis Cluster实现。

4.4使用场景

  • 实时数据处理。
  • 缓存和消息队列。
  • 发布/订阅模型。

5. NATS

5.1安装步骤

5.1.1使用Docker安装

docker run -d --name nats -p 4222:4222 nats

5.1.2手动安装

下载NATS:

wget https://github.com/nats-io/nats-server/releases/download/v2.3.4/nats-server-v2.3.4-linux-amd64.zip

解压文件并进入目录:

unzip nats-server-v2.3.4-linux-amd64.zipcd nats-server-v2.3.4-linux-amd64

启动NATS:

./nats-server

5.2 C#使用示例代码

5.2.1安装NATS.Client

在你的C#项目中安装NATS.Client包:

dotnet add package NATS.Client

5.2.2生产者代码示例

using NATS.Client;using System;using System.Text;

class Program

{

    public static void Main()

    {

        ConnectionFactory factory = new ConnectionFactory();

        using (IConnection connection = factory.CreateConnection())

        {

            connection.Publish("test", Encoding.UTF8.GetBytes("Hello NATS"));

            Console.WriteLine("Message published");

        }

    }

}

5.2.3消费者代码示例

using NATS.Client;using System;using System.Text;

class Program

{

    public static void Main()

    {

        ConnectionFactory factory = new ConnectionFactory();

        using (IConnection connection = factory.CreateConnection())

        {

            EventHandler<MsgHandlerEventArgs> msgHandler = (sender, args) =>

            {

                string message = Encoding.UTF8.GetString(args.Message.Data);

                Console.WriteLine($"Received message: {message}");

            };

            using (IAsyncSubscription subscription = connection.SubscribeAsync("test", msgHandler))

            {

                Console.WriteLine("Press any key to exit");

                Console.ReadKey();

            }

        }

    }

}

5.3特点

  • 高性能:低延迟,高吞吐量。
  • 轻量级:简单易用,配置和部署方便。
  • 多种消息模式:支持请求/响应、发布/订阅等模式。

5.4使用场景

  • 微服务通信。
  • 实时消息传递。
  • 物联网(IoT)应用。

6. Apache Pulsar

6.1安装步骤

6.1.1使用Docker安装

docker run -d --name pulsar -p 6650:6650 -p 8080:8080 apachepulsar/pulsar:latest bin/pulsar standalone

6.1.2手动安装

下载Pulsar:

wget https://archive.apache.org/dist/pulsar/pulsar-2.8.0/apache-pulsar-2.8.0-bin.tar.gz

解压文件并进入目录:

tar -xzf apache-pulsar-2.8.0-bin.tar.gzcd apache-pulsar-2.8.0

启动Pulsar:

bin/pulsar standalone

6.2 C#使用示例代码

6.2.1安装Pulsar.Client.Api

在你的C#项目中安装Pulsar.Client.Api包:

dotnet add package Pulsar.Client.Api

6.2.2生产者代码示例

using Pulsar.Client.Api;using System;using System.Threading.Tasks;

class Program

{

    public static async Task Main(string[] args)

    {

        var client = new PulsarClientBuilder().ServiceUrl("pulsar://localhost:6650").Build();

        var producer = await client.NewProducer(Schema.String).Topic("test-topic").CreateAsync();

        await producer.SendAsync("Hello Pulsar");

        Console.WriteLine("Message sent");

    }

}

6.2.3消费者代码示例

using Pulsar.Client.Api;using System;using System.Threading.Tasks;

class Program

{

    public static async Task Main(string[] args)

    {

        var client = new PulsarClientBuilder().ServiceUrl("pulsar://localhost:6650").Build();

        var consumer = await client.NewConsumer(Schema.String).Topic("test-topic").SubscriptionName("test-subscription").SubscribeAsync();

        var message = await consumer.ReceiveAsync();

        Console.WriteLine($"Received: {message.Value}");

        await consumer.AcknowledgeAsync(message);

    }

}

6.3特点

  • 多租户:支持多租户隔离。
  • 分布式架构:高可用性和扩展性。
  • 流处理:内置Pulsar Functions,支持流处理。

6.4使用场景

  • 实时数据分析。
  • 数据管道。
  • 多租户消息服务。

7. ZeroMQ

7.1安装步骤

7.1.1使用Docker安装

由于ZeroMQ是一个嵌入式库,没有独立的服务器组件,可以直接在项目中安装使用。

7.1.2手动安装

安装依赖:

sudo apt-get install libzmq3-dev

下载并编译ZeroMQ:

wget https://github.com/zeromq/libzmq/releases/download/v4.3.4/zeromq-4.3.4.tar.gz

tar -xzf zeromq-4.3.4.tar.gzcd zeromq-4.3.4

./configure

make

sudo make install

sudo ldconfig

7.2 C#使用示例代码

7.2.1安装NetMQ

在你的C#项目中安装NetMQ包:

dotnet add package NetMQ

7.2.2生产者代码示例

using NetMQ;using NetMQ.Sockets;using System;

class Program

{

    public static void Main()

    {

        using (var pushSocket = new PushSocket("@tcp://localhost:5555"))

        {

            pushSocket.SendFrame("Hello ZeroMQ");

            Console.WriteLine("Message sent");

        }

    }

}

7.2.3消费者代码示例

using NetMQ;using NetMQ.Sockets;using System;

class Program

{

    public static void Main()

    {

        using (var pullSocket = new PullSocket(">tcp://localhost:5555"))

        {

            var message = pullSocket.ReceiveFrameString();

            Console.WriteLine($"Received: {message}");

        }

    }

}

7.3特点

  • 高性能:低延迟,高吞吐量。
  • 灵活性:支持多种消息模式(如请求/响应、发布/订阅等)。
  • 嵌入式库:无中心服务器。

7.4使用场景

  • 高性能分布式系统。
  • 实时数据传输。
  • 微服务通信。

8. Apache RocketMQ

8.1安装步骤

8.1.1使用Docker安装

docker run -d --name rocketmq-namesrv -p 9876:9876 apache/rocketmq:4.8.0 sh mqnamesrv

docker run -d --name rocketmq-broker -p 10911:10911 -p 10909:10909 --link rocketmq-namesrv:namesrv -e "NAMESRV_ADDR=namesrv:9876" apache/rocketmq:4.8.0 sh mqbroker -n namesrv:9876

8.1.2手动安装

下载RocketMQ:

wget https://archive.apache.org/dist/rocketmq/4.8.0/rocketmq-all-4.8.0-bin-release.zip

解压文件并进入目录:

unzip rocketmq-all-4.8.0-bin-release.zipcd rocketmq-4.8.0

启动NameServer:

nohup sh bin/mqnamesrv &

启动Broker:

nohup sh bin/mqbroker -n localhost:9876 &

8.2 C#使用示例代码

8.2.1安装RocketMQ.Client

在你的C#项目中安装RocketMQ.Client包:

dotnet add package RocketMQ.Client

8.2.2生产者代码示例

using RocketMQ.Client;using System;using System.Threading.Tasks;

class Program

{

    public static async Task Main(string[] args)

    {

        var producer = new Producer("testGroup", new ProducerOptions

        {

            NameServerAddress = "localhost:9876"

        });

        await producer.StartAsync();

        var message = new Message("test-topic", "Hello RocketMQ");

        var sendResult = await producer.SendAsync(message);

        Console.WriteLine($"Message sent: {sendResult}");

    }

}

8.2.3消费者代码示例

using RocketMQ.Client;using System;using System.Threading.Tasks;

class Program

{

    public static async Task Main(string[] args)

    {

        var consumer = new Consumer("testGroup", new ConsumerOptions

        {

            NameServerAddress = "localhost:9876",

            Topic = "test-topic",

            MessageModel = MessageModel.Clustering

        });

        consumer.Subscribe(message =>

        {

            Console.WriteLine($"Received message: {message.Body}");

            return Task.CompletedTask;

        });

        await consumer.StartAsync();

        Console.WriteLine("Press any key to exit");

        Console.ReadKey();

    }

}

8.3特点

  • 高性能:低延迟,高吞吐量。
  • 消息顺序:支持顺序消息。
  • 分布式事务:支持分布式事务消息。

8.4使用场景

  • 金融服务。
  • 电子商务订单处理。
  • 实时分析。

9. NSQ

9.1安装步骤

9.1.1使用Docker安装

docker run -d --name nsqlookupd -p 4160:4160 -p 4161:4161 nsqio/nsq /nsqlookupd

docker run -d --name nsqd -p 4150:4150 -p 4151:4151 --link nsqlookupd:nsqlookupd nsqio/nsq /nsqd --lookupd-tcp-address=nsqlookupd:4160

docker run -d --name nsqadmin -p 4171:4171 --link nsqlookupd:nsqlookupd nsqio/nsq /nsqadmin --lookupd-http-address=nsqlookupd:4161

9.1.2手动安装

下载NSQ:

wget https://github.com/nsqio/nsq/releases/download/v1.2.1/nsq-1.2.1.linux-amd64.go1.11.6.tar.gz

解压文件并进入目录:

tar -xzf nsq-1.2.1.linux-amd64.go1.11.6.tar.gz

cd nsq-1.2.1.linux-amd64.go1.11.6/bin

启动NSQ:

./nsqlookupd &

./nsqd --lookupd-tcp-address=127.0.0.1:4160 &

./nsqadmin --lookupd-http-address=127.0.0.1:4161 &

9.2 C#使用示例代码

9.2.1安装NsqSharp

在你的C#项目中安装NsqSharp包:

dotnet add package NsqSharp

9.2.2生产者代码示例

using NsqSharp;using System;

class Program

{

    public static void Main()

    {

        var producer = new Producer("127.0.0.1:4150");

        producer.Publish("test_topic", System.Text.Encoding.UTF8.GetBytes("Hello NSQ"));

        Console.WriteLine("Message sent");

    }

}

9.2.3消费者代码示例

using NsqSharp;using System;

class Program

{

    public static void Main()

    {

        var consumer = new Consumer("test_topic", "test_channel");

        consumer.AddHandler(new MessageHandler());

        consumer.ConnectToNsqLookupd("127.0.0.1:4161");

        Console.WriteLine("Press any key to exit");

        Console.ReadKey();

    }

}

class MessageHandler : IHandler

{

    public void HandleMessage(IMessage message)

    {

        Console.WriteLine($"Received message: {System.Text.Encoding.UTF8.GetString(message.Body)}");

    }

    public void LogFailedMessage(IMessage message)

    {

        Console.WriteLine($"Failed message: {System.Text.Encoding.UTF8.GetString(message.Body)}");

    }

}

9.3特点

  • 易于使用:配置简单,使用方便。
  • 高可用性:自动发现和负载均衡。
  • 实时消息:低延迟的实时消息传递。

9.4使用场景

  • 实时分析。
  • 监控系统。
  • 实时聊天。

10. Kafka Streams

10.1安装步骤

Kafka Streams是Kafka的一部分,安装Kafka即可使用Kafka Streams。

10.2 C#使用示例代码

目前,Kafka Streams主要用于Java。C#可以通过Kafka Streams的交互API来实现类似功能。

10.3特点

  • 流处理:内置的流处理能力。
  • 高吞吐量:继承Kafka的高吞吐特性。
  • 分布式:自动分布和容错。

10.4使用场景

  • 实时数据处理。
  • 流分析。
  • 复杂事件处理。

  • 11.特点对比

特点

Kafka

RabbitMQ

ActiveMQ

Redis (Streams)

NATS

Pulsar

ZeroMQ

RocketMQ

NSQ

Kafka Streams

高吞吐量

低延迟

持久化

消息模型

Pub/Sub、Queue

Pub/Sub、Queue

Pub/Sub、Queue

Stream

Pub/Sub、Queue

Pub/Sub、Queue

Pub/Sub、Queue

Pub/Sub、Queue

Pub/Sub、Queue

Stream

高可用性

多协议

12.使用场景对比

使用场景

Kafka

RabbitMQ

ActiveMQ

Redis (Streams)

NATS

Pulsar

ZeroMQ

RocketMQ

NSQ

Kafka Streams

实时数据处理

非常适合,特别是需要高吞吐量和低延迟的场景

适合,特别是需要可靠性的场景

适合,特别是企业应用集成场景

非常适合,需要极低延迟和内存操作的场景

非常适合,轻量级和低延迟的场景

非常适合,需要多租户和高可用性的场景

适合,需要嵌入式高性能通信的场景

非常适合,金融服务和电子商务场景

非常适合,需要实时性和高可用性的场景

非常适合,需要复杂流处理和高吞吐量的场景

微服务架构

非常适合,特别是事件驱动的微服务架构

非常适合,特别是需要事务支持的场景

适合,特别是基于JMS的应用

适合,需要快速缓存和消息传递的场景

非常适合,轻量级微服务通信

非常适合,特别是需要流处理的微服务架构

适合,需要简单、快速的消息传递

非常适合,特别是大规模分布式系统

适合,需要快速部署和低运维的场景

非常适合,特别是需要流处理的微服务架构

大数据分析

非常适合,支持高吞吐量和流处理

适合,数据规模较小时使用

不太适合,大数据场景下性能不足

适合,需要实时数据存储和处理的场景

不太适合,主要用于轻量级消息传递

非常适合,特别是多租户数据分析场景

不太适合,缺乏大数据处理能力

非常适合,大规模数据处理场景

不太适合,主要用于实时消息传递

非常适合,需要实时流数据处理的场景

事件驱动架构

非常适合,特别是需要可靠性的事件处理

非常适合,提供丰富的事件处理功能

适合,企业级事件驱动架构

适合,需要快速处理事件和缓存的场景

非常适合,轻量级事件驱动架构

非常适合,特别是需要流处理的事件驱动架构

适合,需要高性能事件传递的场景

非常适合,特别是金融和电子商务场景

适合,轻量级事件驱动架构

非常适合,需要复杂事件处理的场景

企业应用集成

适合,特别是需要处理大量数据的场景

非常适合,提供丰富的企业级功能

非常适合,特别是基于JMS的企业集成

适合,需要快速数据存储和处理的场景

不太适合,主要用于轻量级消息传递

适合,需要多租户隔离的企业集成

不太适合,缺乏企业级功能

非常适合,企业级应用集成场景

不太适合,主要用于实时消息传递

不太适合,主要用于流处理和分析

物联网(IoT)

适合,需要处理大量传感器数据

适合,提供可靠的消息传递机制

适合,特别是需要企业级集成的场景

非常适合,需要实时处理和存储数据的场景

非常适合,轻量级和低延迟的IoT应用

适合,需要多租户隔离的IoT应用

非常适合,需要高性能和低延迟的IoT应用

适合,需要可靠消息传递的IoT应用

非常适合,需要实时处理的IoT应用

适合,需要实时流处理的IoT应用

金融服务

非常适合,需要高可靠性和高吞吐量的场景

适合,特别是需要事务支持的场景

适合,需要企业级可靠性的场景

适合,需要低延迟和高可靠性的场景

不太适合,主要用于轻量级消息传递

非常适合,需要高可靠性和多租户的场景

适合,需要高性能和低延迟的场景

非常适合,特别是需要分布式事务的场景

适合,需要高可靠性和实时性的场景

适合,需要复杂流处理和分析的场景

实时聊天

适合,需要高吞吐量和低延迟的场景

适合,特别是需要可靠消息传递的场景

适合,需要企业级可靠性的场景

非常适合,需要低延迟和快速处理的场景

非常适合,需要轻量级和低延迟的场景

适合,需要高可用性和多租户隔离的场景

非常适合,需要高性能和低延迟的场景

适合,需要可靠消息传递的场景

非常适合,需要实时处理的场景

适合,需要实时流处理和分析的场景

监控系统

非常适合,需要处理大量监控数据的场景

适合,需要可靠消息传递的场景

适合,需要企业级可靠性的场景

非常适合,需要实时处理和存储数据的场景

非常适合,需要轻量级和低延迟的场景

适合,需要高可用性和多租户隔离的场景

适合,需要高性能和低延迟的场景

适合,需要可靠消息传递的场景

非常适合,需要实时处理的场景

适合,需要实时流处理和分析的场景

13.选型策略

选择合适的消息队列或流处理平台需要根据具体的使用场景和需求进行评估。以下是一些选型策略:

高吞吐量和低延迟

  • Kafka 和 Pulsar 适合需要高吞吐量和低延迟的场景,如实时数据处理和大数据分析。
  • Redis (Streams) 和 NATS 适合需要极低延迟的场景,如实时聊天和物联网应用。

企业级应用集成

    • RabbitMQ 和 ActiveMQ 提供丰富的企业级功能,适合需要可靠性和事务支持的企业应用集成。
    • RocketMQ 适合需要分布式事务和高可靠性的金融服务和电子商务场景。

实时数据处理和流处理

    • Kafka Streams 和 Pulsar 适合需要复杂流处理和实时数据分析的场景。
    • NSQ 适合需要实时处理和低运维的轻量级流处理场景。

轻量级和嵌入式应用

    • ZeroMQ 适合需要高性能和低延迟的嵌入式通信。
    • NATS 适合需要轻量级和快速消息传递的微服务和物联网应用。

特定需求

    • Redis (Streams) 适合需要内存存储和极低延迟的实时数据处理和缓存场景。
    • Pulsar 适合需要多租户隔离和高可用性的多租户数据分析和事件驱动架构。

通过对比各种消息队列和流处理平台的特点和使用场景,可以更好地选择适合自己需求的技术方案。

相关文章:

开源消息队列比较

目录 1. Apache Kafka 1.1安装步骤 1.1.1使用Docker安装 1.1.1手动安装 1.2 C#使用示例代码 1.2.1 安装Confluent.Kafka 1.2.2生产者代码示例 1.2.3消费者代码示例 1.3特点 1.4使用场景 2. RabbitMQ 2.1安装步骤 2.1.1使用Docker安装 2.1.2手动安装 2.2 C#使用示…...

【前端逆向】最佳JS反编译利器,原来就是chrome!

有时候需要反编译别人的 min.js。 比如简单改库、看看别人的 min,js 干了什么&#xff0c;有没有重复加载&#xff1f;此时就需要去反编译Javascript。 Vscode 里面有一些反编译插件&#xff0c;某某Beautify等等。但这些插件看人品&#xff0c;运气不好搞的话&#xff0c;反…...

微信小程序根据动态权限展示tabbar

微信小程序自定义 TabBar 后根据权限动态展示tabbar 在微信小程序开发中,自定义 TabBar 可以让应用更具灵活性和个性化。特别是在用户根据不同权限展示不同的 TabBar 内容时,正确的实现方法能够提升用户体验。本篇文章将分享如何使用事件总线实现权限变动时动态更新自定义 T…...

开源安全信息和事件管理(SIEM)平台OSSIM

简介 OSSIM&#xff0c;开源安全信息和事件管理&#xff08;SIEM&#xff09;产品&#xff0c;提供了经过验证的核心SIEM功能&#xff0c;包括事件收集、标准化和关联。 OSSIM作为一个开源平台&#xff0c;具有灵活性和可定制性高的优点&#xff0c;允许用户根据自己的特定需…...

【DP】01背包

算法-01背包 前置知识 DP 思路 01背包一般分为两种&#xff0c;不妨叫做价值01背包和判断01背包。 价值01背包 01背包问题是这样的一类问题&#xff1a;给定一个背包的容量 m m m 和 n n n 个物品&#xff0c;每个物品有重量 w w w 和价值 v v v&#xff0c;求不超过背…...

50、PHP 实现选择排序

题目&#xff1a; PHP 实现选择排序 描述&#xff1a; n个记录的文件的直接选择排序可经过n-1趟直接选择排序得到有序结果&#xff1a;(1)初始状态&#xff1a;无序区为R[1…n]&#xff0c;有序区为空。(2)第1趟排序在无序区R[1…n]中选出关键字最小的记录R[k]&#xff0c;将…...

17.延迟队列

介绍 延迟队列&#xff0c;队列内部是有序的&#xff0c;延迟队列中的元素是希望在指定时间到了以后或之前取出和处理。 死信队列中&#xff0c;消息TTL过期的情况其实就是延迟队列。 使用场景 1.订单在十分钟内未支付则自动取消。 2.新创建的店铺&#xff0c;如果十天内没…...

KCache-go本地缓存,支持本地缓存过期、缓存过期自维护机制。

GitHub - kocor01/kcache: go 本地缓存解决方案&#xff0c;支持本地缓存过期、缓存过期自维护机制。 最近系统并发很高&#xff0c;单接口10W的 QPS&#xff0c;对 redis 压力很大&#xff0c;大量的热KEY导致 redis 分片CPU资源经常告警。计划用 go 本地缓存缓解 redis 的压…...

斯坦福UE4 C++课学习补充 14:UMG-优化血量条

文章目录 一、优化执行效率二、简单脉冲动画 一、优化执行效率 绑定事件需要每一帧检查绑定对象是否有变化&#xff0c;势必造成CPU资源的浪费&#xff0c;因此优化执行效率的思路是&#xff1a;UI组件不再自行每帧查询血量&#xff0c;而是让血量自己在发生变化的同时通知UI进…...

在生信分析中大家需要特别注意的事情​

在生信分析中大家需要特别注意的事情 标准的软件使用和数据分析流程 1. 先看我的b站教学视频 2. 先从我的百度网盘把演示数据集下载下来&#xff0c;先把要运行的模块的演示数据集先运行一遍 3. 前两步都做完了&#xff0c;演示数据集也运行成功了&#xff0c;并且知道了软件…...

Java工厂模式详解:方法工厂模式与抽象工厂模式

Java工厂模式详解&#xff1a;方法工厂模式与抽象工厂模式 一、引言 在Java开发中&#xff0c;设计模式是解决常见软件设计问题的一种有效方式。工厂模式作为创建型设计模式的一种&#xff0c;提供了灵活的对象创建机制&#xff0c;有助于降低代码的耦合度&#xff0c;提高系…...

springSecurity学习之springSecurity用户单设备登录

用户只能单设备登录 有时候在同一个系统中&#xff0c;只允许一个用户在一个设备登录。 之前的登陆者被顶掉 将最大会话数设置为1就可以保证用户只能同时在一个设备上登录 Override protected void configure(HttpSecurity http) throws Exception {http..anyRequest().aut…...

微信小程序实现聊天界面,发送功能

.wxml <scroll-view scroll-y"true" style"height: {{windowHeight}}px;"><view wx:for"{{chatList}}" wx:for-index"index" wx:for-item"item" style"padding-top:{{index0?30:0}}rpx"><!-- 左…...

【强化学习的数学原理】课程笔记--5(值函数近似,策略梯度方法)

目录 值函数近似一个例子TD 算法的值函数近似形式Sarsa, Q-learning 的值函数近似形式Deep Q-learningexperience replay 策略梯度方法&#xff08;Policy Gradient&#xff09;Policy Gradient 的目标函数目标函数 1目标函数 2两种目标函数的同一性 Policy Gradient 目标函数的…...

前端Long类型精度丢失:后端处理策略

文章目录 精度丢失的具体原因解决方法1. 使用 JsonSerialize 和 ToStringSerializer2. 使用 JsonFormat 注解3. 全局配置解决方案 结论 开发商城管理系统的品牌管理界面时&#xff0c;发现一个问题&#xff0c;接口返回品牌Id和页面展示的品牌Id不一致&#xff0c;如接口返回的…...

C++ | Leetcode C++题解之第300题最长递增子序列

题目&#xff1a; 题解&#xff1a; class Solution { public:int lengthOfLIS(vector<int>& nums) {int len 1, n (int)nums.size();if (n 0) {return 0;}vector<int> d(n 1, 0);d[len] nums[0];for (int i 1; i < n; i) {if (nums[i] > d[len])…...

springboo 整合 redis

springBoot 整合 redis starter启动依赖。—包含自动装配类—完成相应的装配功能。 引入依赖 <!--引入了redis整合springboot 的依赖--> <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis&…...

dpdk编译安装以及接收udp报文(基于ubuntu)

目录 1、编译 2、设置运行环境 3、使用dpdk接收udp报文 3.1、设置发送端arp信息 3.2、测试 3.3、代码 4、其他 1、编译 代码下载&#xff1a; DPDK 下载版本&#xff1a;DPDK 19.08.2 export RTE_SDK/root/dpdk-stable-19.08.2/ export RTE_TARGETx86_64-native-li…...

【计算机网络】OSPF单区域实验

一&#xff1a;实验目的 1&#xff1a;掌握在路由器上配置OSPF单区域。 2&#xff1a;学习OSPF协议的原理&#xff0c;及其网络拓扑结构改变后的变化。 二&#xff1a;实验仪器设备及软件 硬件&#xff1a;RCMS交换机、网线、内网网卡接口、Windows 2019操作系统的计算机等。…...

Java聚合快递小程序对接云洋系统程序app源码

​一场物流效率的革命 引言&#xff1a;物流新时代的序章 在数字化浪潮席卷各行各业的今天&#xff0c;物流行业也迎来了前所未有的变革。为了进一步提升物流效率&#xff0c;优化用户体验&#xff0c;聚合快递系统与云洋系统小程序的对接成为了行业内外关注的焦点。这一创新…...

【React】详解组件通信:从基础到进阶的全面指南

文章目录 一、父组件向子组件传递数据1. 基本概念2. 示例代码3. 详解定义子组件 Son定义父组件 App导出父组件 App数据流props 的内容 二、子组件向父组件传递数据1. 基本概念2. 示例代码3. 详解引入React库和useState钩子定义子组件 Son定义父组件 App导出父组件 App数据流 三…...

【vluhub】zabbix漏洞

介绍&#xff1a; zabbix是对服务器资源状态例如、内存空间、CPU、程序运行状态进行检测、设置预警值、短信设置等功能等一款开源工具。配置不当存在未授权,SQL注入漏洞 弱口令 nameadmin&passwordzabbix nameguest&password POST /index.php HTTP/1.1 Host: 192.1…...

openGauss触发器详解

openGauss 是一款开源关系型数据库管理系统&#xff0c;广泛应用于企业级应用中。随着数据量的增长和业务逻辑的复杂化&#xff0c;数据库管理和操作的自动化需求越来越高。触发器&#xff08;Triggers&#xff09;作为数据库中重要的编程工具&#xff0c;能够极大地简化复杂操…...

抄作业-跟着《React通关秘籍》捣鼓React-playground-上集

文章目录 前言1. 搭建react 开发环境2、react hooks 知识3. 目标&#xff1a;跟着小册实现 react-playground3.1 整体布局初始化项目使用Alloment 来实现左右分屏的拖拉功能 3.2 代码编辑器Monaco Editor 3.3 实现了多文件的切换用 useContext 来共享数据。优化 tab的样式&…...

80后最后的书信 年代

当时11亿人口只有1.8万部固定电话 中国几千年来 鱼传尺素 雁寄鸿书 写信最后要写 亲啓 如有照片&#xff0c;封面要写内有照片&#xff0c;请勿折叠 信的开头应该是 见字如面&#xff0c;展信舒颜 如果拜托别人做事情&#xff0c;最后要写为盼 最后要写 某某草 书未尽…...

软考-软件设计师(4)-计算机网络与安全:OSI七层、子网划分、网络安全控制技术、网络安全协议、网络安全威胁、对称与非对称加密等高频考点

场景 软考-软件设计师-计算机网络与信息安全模块高频考点整理。 以下为高频考点、知识点汇总,不代表该模块所有知识点覆盖,请以官方教程提纲为准。 注: 博客:霸道流氓气质-CSDN博客 实现 知识点 OSI/RM七层模型 注意各层的主要功能,特别是表示层负责数据的加密、压…...

Unity横板动作游戏 -为什么我又开始学习Unity,而不是Godot。

Readme 最近开始学习Unity制作2D动作游戏&#xff0c;由于一些操作第一次接触&#xff0c;为了加深印象&#xff0c;准备写这样一篇同步教程的笔记。 之前也接触过Unity&#xff0c;用 Unity 制作过一个非常简单的小游戏 Flappy Bird&#xff0c;并且魔改成了泰拉瑞亚的版本。…...

什么是NIO

NIO&#xff08;New Input/Output&#xff09;&#xff0c;也称为Java非阻塞IO&#xff0c;是从Java 1.4版本开始引入的一个新的IO API&#xff0c;旨在提供一种比传统的阻塞IO更高效、更灵活的IO操作方式。 一 NIO用法的详细介绍 NIO支持面向缓冲区的、基于通道的IO操作&…...

PHP switch 替代品 match

match 是 PHP 8 中引入的新特性。在 PHP 8 中&#xff0c;match 用作新的类型安全的替代 switch 语句。它提供了更清晰、更简洁的语法&#xff0c;同时还支持表达式作为条件&#xff0c;可以更轻松地处理复杂的条件逻辑。 在 match 表达式中&#xff0c;每个分支都是一个条件和…...

FastAPI(七十四)实战开发《在线课程学习系统》接口开发-- 删除留言

源码见&#xff1a;"fastapi_study_road-learning_system_online_courses: fastapi框架实战之--在线课程学习系统" 之前文章FastAPI&#xff08;七十三&#xff09;实战开发《在线课程学习系统》接口开发-- 回复留言&#xff0c;那么我们这次分享删除留言接口的开发…...

面试重点---快速排序

快排单趟 快速排序是我们面试中的重点&#xff0c;这个知识点也很抽象&#xff0c;需要我们很好的掌握&#xff0c;而且快速排序的代码也是非常重要&#xff0c;需要我们懂了还不行&#xff0c;必须要手撕代码&#xff0c;学的透彻。 在研究快速排序之前&#xff0c;我们首先…...

[MIT6.5840]MapReduce

MapReduce Lab 地址 https://pdos.csail.mit.edu/6.824/labs/lab-mr.html 论文地址 https://static.googleusercontent.com/media/research.google.com/zh-CN//archive/mapreduce-osdi04.pdf 工作原理 简单来讲&#xff0c;MapReduce是一种分布式框架&#xff0c;可以用来处理…...

【系统架构设计师】计算机组成与体系结构 ⑯ ( 奇偶校验码 | CRC 循环冗余码 | 海明码 | 模 2 除法 )

文章目录 一、校验码1、校验码由来2、奇偶校验码3、CRC 循环冗余码 ( 重点考点 )4、海明码校验 ( 软考不经常考到 ) 二、CRC 循环冗余码 ( 重点考点 )1、模 2 除法概念2、模 2 除法步骤3、模 2 除法示例4、CRC 循环冗余码示例 15、CRC 循环冗余码示例 2 参考之前的博客 : 【计…...

springboot,service 层统一异常抛出时,throws Exception写在接口上还是实现类上

springboot,service 层统一异常抛出时&#xff0c;throws Exception写在实现接口上&#xff0c;不是直接写在实现类上...

深度学习高效性网络

为了减轻Transformer笨重的计算成本&#xff0c;一系列工作重点开发了高效的Vision Transformer&#xff0c;如Swin Transformer、PVT、Twins、CoAtNet和MobileViT。 1、字节TRT-ViT 兼具CNN的速度、Transformer精度的模型 TRT-ViT&#xff08;Transformer-based Vision Tra…...

PyQt ERROR:ModuleNotFoundError: No module named ‘matplotlib‘

Solution:打开cmd输入指令下载malplotlib pip install matplotlib...

Flutter Geolocator插件使用指南:获取和监听地理位置

Flutter Geolocator插件使用指南&#xff1a;获取和监听地理位置 简介 geolocator 是一个Flutter插件&#xff0c;提供了一个简单易用的API来访问特定平台的地理位置服务。它支持获取设备的最后已知位置、当前位置、连续位置更新、检查设备上是否启用了位置服务&#xff0c;以…...

网站基本布局CSS

代码 <!DOCTYPE html> <html> <head><meta charset"utf-8"><meta name"viewport" content"widthdevice-width, initial-scale1"><title></title><style type"text/css">body {margi…...

ssm框架整合,异常处理器和拦截器(纯注解开发)

目录 ssm框架整合 第一步&#xff1a;指定打包方式和导入所需要的依赖 打包方法&#xff1a;war springMVC所需依赖 解析json依赖 mybatis依赖 数据库驱动依赖 druid数据源依赖 junit依赖 第二步&#xff1a;导入tomcat插件 第三步&#xff1a;编写配置类 SpringCon…...

古籍双层PDF制作教程:保姆级古籍数字化教程

在智慧古籍数字化项目中&#xff0c;很多图书馆要求将古籍导出为双层PDF&#xff0c;并且确保输出双层PDF底层文本与上层图片偏移量控制在1毫米以内。那么本教程带你使用古籍数字化平台&#xff0c;3分钟把一个古籍书籍转化为双侧PDF。 第1步&#xff1a;上传古籍 点批量上传…...

Git 删除 远端的分支

要删除 Git 远端的分支&#xff08;例如&#xff1a; V3.2.1.13&#xff09;&#xff1a; 可以执行以下命令 git push origin --delete V3.2.1.13这条命令会向远端的仓库删除名为 V3.2.1.13 的分支。如果这个分支只在远端仓库存在而没有对应的本地分支&#xff0c;那么删除后这…...

PrgogressBar实现原理分析

ProgressBar 是 Android 中用于显示进度条的控件&#xff0c;它可以用来表示任务的完成程度或者加载进度等信息。ProgressBar 有两种主要类型&#xff1a;一种是确定性的&#xff08;determinate&#xff09;&#xff0c;另一种是不确定性的&#xff08;indeterminate&#xff…...

【HarmonyOS】HarmonyOS NEXT学习日记:七、页面与组件的生命周期

【HarmonyOS】HarmonyOS NEXT学习日记&#xff1a;七、页面与组件的生命周期 页面和组件 组件&#xff1a;用Component装饰的代码称为自定义组件页面&#xff1a;Entry装饰的组件即页面的根节点 组件生命周期 aboutToAppear&#xff1a;在创建自定义组件的新实例后&#xf…...

【iOS】——Block循环引用

循环引用原因 如果在Block中使用附有_ _strong修饰符的对象类型自动变量&#xff0c;那么当Block从栈复制到堆时&#xff0c;该对象为Block所持有&#xff0c;这样容易引起循环引用。 HPPerson *person [[HPPerson alloc] init];person.block ^{NSLog("person.age--- …...

shell脚本自动化安装启动各种服务

1、自动化配置dns服务器 A主机&#xff1a;vim dns.sh #!/bin/bash# 自动化部署dns# 1、下载bind# 2、修改配置文件# vim /etc/named.conf # listen-on port 53 { 127.0.0.1;any; }; 修改&#xff08;定位替换&#xff09;# allow-query { localhost;any; }; 修改&am…...

Python - 开源库 ReportLab 库合并 CVS 和图像生成 PDF 文档

欢迎关注我的CSDN&#xff1a;https://spike.blog.csdn.net/ 本文地址&#xff1a;https://spike.blog.csdn.net/article/details/140281680 免责声明&#xff1a;本文来源于个人知识与公开资料&#xff0c;仅用于学术交流&#xff0c;欢迎讨论&#xff0c;不支持转载。 Report…...

Java编写SIP协议

1、编写Server代码 package com.genersoft.iot.vmp.sip; import javax.sip.*; import javax.sip.message.*; import javax.sip.header.*; import java.util.*;public class SimpleSipServer implements SipListener {private SipFactory sipFactory;private SipStack sipStack…...

大型语言模型LLM的核心概念

本文主要介绍了目前主流的&#xff0c;几个大型语言模型LLM的整个训练过程 通常分为下面的几个阶段 1. 预训练 采用互联网上的大量数据进行训练&#xff0c;这一阶段大模型LLM的主体已定&#xff0c;找出共性并且压缩成一个模型。模型的参数量不是越大越好&#xff0c;遵循合理…...

软件测试---网络基础、HTTP

一、网络基础 &#xff08;1&#xff09;Web和网络知识 网络基础TCP/IP 使用HTTP协议访问Web WWW万维网的诞生 WWW万维网的构成 &#xff08;2&#xff09;IP协议 &#xff08;3&#xff09;可靠传输的TCP和三次握手策略 &#xff08;4&#xff09;域名解析服务DNS &#xff0…...

韩顺平0基础学java——第39天

p820-841 jdbc和连接池 1.JDBC为访问不同的数据库提供了统一的接口&#xff0c;为使用者屏蔽了细节问题。 2.Java程序员使用JDBC&#xff0c;可以连接任何提供了JDBC驱动程序的数据库系统&#xff0c;从而完成对数据库的各种操作。 3.jdbc原理图 JDBC带来的好处 2.JDBC带来的…...