【几种 mq 的区别及使用案例代码】

朴灿烈づ我的快乐病毒、 2024-03-26 14:50 73阅读 0赞

消息队列(Message Queue,MQ)是一种常见的异步通信方式,常用于解耦应用组件、提高系统可用性和扩展性、降低系统耦合度等。常见的消息队列有以下几种:

  1. RabbitMQ RabbitMQ 是一款使用 Erlang 语言编写的 AMQP 消息队列,具有性能高、可扩展性好、支持多种编程语言、可靠性强等优点。RabbitMQ 的主要应用场景包括:异步处理、解耦应用、实现RPC、实现发布/订阅模式等。
  2. ActiveMQ ActiveMQ 是一个基于 JMS 规范的消息队列,具有支持多种协议、支持多种语言、高可用性、可扩展性等特点。ActiveMQ 主要应用场景包括:解耦应用、异步通信、分布式系统、大数据处理等。
  3. Kafka Kafka 是一款高性能、分布式、可扩展的消息队列,具有支持多种协议、支持多种语言、可靠性好、高吞吐量等特点。Kafka 主要应用场景包括:大数据处理、实时数据流处理、日志处理等。
  4. RocketMQ RocketMQ 是一款使用 Java 语言编写的分布式消息队列,具有高可用性、高吞吐量、多种消息模式等特点。RocketMQ 主要应用场景包括:异步通信、流式计算、微服务等。
  5. Redis Redis 是一个高性能的 key-value 存储系统,可以通过 ListSetHash 等数据结构实现消息队列的功能。Redis 主要应用场景包括:实时数据处理、消息推送、日志处理等。

以上几种消息队列在应用场景和特点上都有所不同,具体选择哪一种消息队列要根据业务需求和系统特点进行选择。在实际应用中,也可以使用多种消息队列协同工作,以达到更好的效果。
以下是几种 MQ 在 Java 中的使用案例代码:

RabbitMQ 生产者代码:

  1. @Component
  2. public class RabbitMQProducer {
  3. @Autowired
  4. private RabbitTemplate rabbitTemplate;
  5. public void sendMessage(String message) {
  6. rabbitTemplate.convertAndSend("my-exchange", "my-routing-key", message);
  7. }
  8. }

消费者代码:

  1. @Component
  2. public class RabbitMQConsumer {
  3. @RabbitListener(queues = "my-queue")
  4. public void receiveMessage(String message) {
  5. System.out.println("Received message: " + message);
  6. }
  7. }

ActiveMQ 生产者代码:

  1. @Component
  2. public class ActiveMQProducer {
  3. @Autowired
  4. private JmsTemplate jmsTemplate;
  5. public void sendMessage(String message) {
  6. jmsTemplate.convertAndSend("my-destination", message);
  7. }
  8. }

消费者代码:

  1. @Component
  2. public class ActiveMQConsumer implements MessageListener {
  3. @Override
  4. public void onMessage(Message message) {
  5. if (message instanceof TextMessage) {
  6. TextMessage textMessage = (TextMessage) message;
  7. try {
  8. String messageContent = textMessage.getText();
  9. System.out.println("Received message: " + messageContent);
  10. } catch (JMSException e) {
  11. e.printStackTrace();
  12. }
  13. }
  14. }
  15. }

Kafka 生产者代码:

  1. @Component
  2. public class KafkaProducer {
  3. @Autowired
  4. private KafkaTemplate<String, String> kafkaTemplate;
  5. public void sendMessage(String message) {
  6. kafkaTemplate.send("my-topic", message);
  7. }
  8. }

消费者代码:

  1. @Component
  2. public class KafkaConsumer {
  3. @KafkaListener(topics = "my-topic")
  4. public void receiveMessage(String message) {
  5. System.out.println("Received message: " + message);
  6. }
  7. }

RocketMQ 生产者代码:

  1. @Component
  2. public class RocketMQProducer {
  3. @Autowired
  4. private DefaultMQProducer producer;
  5. public void sendMessage(String message) throws Exception {
  6. Message mqMessage = new Message("my-topic", "my-tag", message.getBytes(RemotingHelper.DEFAULT_CHARSET));
  7. SendResult result = producer.send(mqMessage);
  8. System.out.println("Message ID: " + result.getMsgId());
  9. }
  10. }

消费者代码:

  1. @Component
  2. public class RocketMQConsumer implements MessageListenerConcurrently {
  3. @Override
  4. public ConsumeConcurrentlyStatus consumeMessage(List<MessageExt> messages, ConsumeConcurrentlyContext context) {
  5. for (MessageExt message : messages) {
  6. try {
  7. String messageContent = new String(message.getBody(), RemotingHelper.DEFAULT_CHARSET);
  8. System.out.println("Received message: " + messageContent);
  9. } catch (UnsupportedEncodingException e) {
  10. e.printStackTrace();
  11. }
  12. }
  13. return ConsumeConcurrentlyStatus.CONSUME_SUCCESS;
  14. }
  15. }

Redis 生产者代码:

  1. @Component
  2. public class RedisProducer {
  3. @Autowired
  4. private RedisTemplate<String, String> redisTemplate;
  5. public void sendMessage(String message) {
  6. redisTemplate.opsForList().leftPush("my-list", message);
  7. }
  8. }

消费者代码:

  1. @Component
  2. public class RedisConsumer {
  3. @Scheduled(fixedDelay = 1000)
  4. public void receiveMessage() {
  5. String message = redisTemplate.opsForList().rightPop("my-list");
  6. if (message != null) {
  7. System.out.println("Received message: " + message);
  8. }
  9. }
  10. }

发表评论

表情:
评论列表 (有 0 条评论,73人围观)

还没有评论,来说两句吧...

相关阅读