java消息中间件,ActiveMQ、RabbitMQ和Kafka之间的选择

 

 

 

消息中间件用于处理异步消息

优点:

系统解耦、异步、横向扩展、安全可靠,保存消息直到消息调用完全部服务处理完后

什么是中间件?

非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件。

什么消息中间件?

关注于数据的发送和接收,利用高效可靠的异步消息传递机制集成分布式系统

什么是JMS

JMS即java消息服务(java Message Service),是一个java中关于面向消息中间件的API,用于在两个应用程序间或分布式系统中发送消息,进行异步通信。

什么是AMQP?

AMQP(advanced message queuing protocol)是一个提供统一消息服务的应用层标准协议,基于此协议的客户端和中间件可传递消息。

常见的消息中间件

ActiveMQ,完全支持JMS和J2EE,支持多语言和多协议

RabbitMQ,是一个开源的AMQP实现,用于在分布式系统中存储转发消息。扩展性、易用性、高可用性等方面表现不俗。支持多客户端多语言,是AMQP的完整实现,

Kafka(主要是日志服务), 一种高吞吐量的分布式发布订阅消息系统,是一个分布式的、分区的、可靠的分布式日志存储服务,它通过一种独一无二的设计提供了一个消息系统的功能

ActiveMQ、RabbitMQ和Kafka的区别:

JMS概念

提供者、客户端、生产者/发布者、消费者/订阅者、消息、消息模式(在客户端之间传递消息的方式),JMS中定义了主题和队列两种模式。

消息模式:

队列模式:客户端包括生产者和消费者,队列中的消息只能被一个消费者消费,消费者可以随时消费队列中的消息(多个应用分摊了JMS队列的消息)

主题模式:客户端包括发布者、订阅者,主题中的消息被所有消费者消费,消费者不能订阅消费前就订阅到主题中的消息

JMS编码接口:

ConnectionFactory:用于创建连接到消息中间件的连接工厂

Connection:代表了应用程序和消息服务器间的通信链路

Destination指消息发布和接收的地点,包括队列和主题

Session表示一个单线程的上下文,用于发送和接收消息

MessageConsumer 由会话创建,用于接收发送到目标的消息。

MessageProducer用于发送消息到目标

Message,消费者生产者间传送的对象

 

ActiveMQ的使用

功能实现

ActiveMQ实现java消息中间件的队列模式和主题模式这两种消息模式:

队列模式:

消息生产者:创建连接工厂——>创建连接——>创建session会话——>创建队列目标

session.createQueue(queueName))——>创建消息的生产者——>生产者创建消息并发布消息——>关闭连接

消息消费者:创建连接工厂——>创建连接——>创建session会话——>创建队列目标

session.createQueue(queueName))——>创建消息的消费者——>创建消息监听器——>消费者接收消息并处理

 

主题模式:

消息生产者:创建连接工厂——>创建连接——>创建session会话——>创建队列目标

session.createTopic(topicName)——>创建消息的生产者——>生产者创建消息并发布消息——>关闭连接

消息消费者:创建连接工厂——>创建连接——>创建session会话——>创建队列目标

session.createTopic(topicName)——>创建消息的消费者——>创建消息监听器——>消费者接收消息并处理

创建项目,引入ActiveMQ依赖

生产者:

package com.zjl.mq;

import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;


class AppProducer {

    private static final String url = "tcp://10.0.38.70:61616"; // 消息发送的服务地址。61616为服务默认端口
    private static final String queueName = "queue-test"; // 注册的队列名字

    public static void main(String[] args) {
        try {
            // 1.创建ConnectionFactory
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);

            // 2.创建Connection
            Connection connection = null;
            connection = connectionFactory.createConnection();

            // 3.启动链接
            connection.start();

            // 4.创建回话
            // false:是否使用事务,AUTO_ACKNOWLEDGE:设置为自动应答的方式
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            // 5.创建一个目标
            Destination destination = session.createQueue(queueName);

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

            for (int i = 0; i < 100; i++) {
                // 7.创建消息
                TextMessage textMessage = session.createTextMessage("test" + i);

                // 8.发布消息
                producer.send(textMessage);
                System.out.println("发送消息" + textMessage.getText());

            }
            // 9.关闭链接
            connection.close();

        } catch (JMSException e) {
            e.printStackTrace();
        }


    }


}

 消费者:

package com.zjl.mq;


import org.apache.activemq.ActiveMQConnectionFactory;

import javax.jms.*;


public class AppConsumer {
    private static final String url = "tcp://10.0.38.70:61616"; // 消息发送的服务地址。61616为服务默认端口
    private static final String queueName = "queue-test"; // 注册的队列名字

    public static void main(String[] args) {
        try {
            // 1.创建ConnectionFactory
            ConnectionFactory connectionFactory = new ActiveMQConnectionFactory(url);

            // 2.创建Connection
            Connection connection = null;
            connection = connectionFactory.createConnection();

            // 3.启动链接
            connection.start();

            // 4.创建回话
            // false:是否使用事务,AUTO_ACKNOWLEDGE:设置为自动应答的方式
            Session session = connection.createSession(false, Session.AUTO_ACKNOWLEDGE);

            // 5.创建一个目标
            Destination destination = session.createQueue(queueName);

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

            //7.创建一个监听器
            consumer.setMessageListener(new MessageListener() {
                public void onMessage(Message message) {
                    TextMessage textMessage = (TextMessage) message;
                    try {
                        System.out.println("接收消息" + textMessage.getText());
                    } catch (JMSException e) {
                        e.printStackTrace();
                    }
                }
            });
            /*// 8.关闭链接
            connection.close();*/
        } catch (JMSException e) {
            e.printStackTrace();
        }


    }
}

 ActiveMQ、RabbitMQ和Kafka之间的选择

Kafka 的定位主要在日志等方面, 因为Kafka 设计的初衷就是处理日志的,可以看做是一个日志(消息)系统一个重要组件,针对性很强,所以 如果业务方面还是建议选择 RabbitMq 。 在  Kafka  和   RabbitMq  中选择一个适合自己团队和业务的,这个才是最重要的。

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值