java消息中间件,ActiveMQ、RabbitMQ和Kafka之间的选择
消息中间件用于处理异步消息优点:系统解耦、异步、横向扩展、安全可靠,保存消息直到消息调用完全部服务处理完后什么是中间件?非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件。什么消息中间件?关注于数据的发送和接收,利用高效可靠的异步消息传递机制集成分布式系统什么是JMSJMS即java消息服务(ja...
消息中间件用于处理异步消息
优点:
系统解耦、异步、横向扩展、安全可靠,保存消息直到消息调用完全部服务处理完后
什么是中间件?
非底层操作系统软件,非业务应用软件,不是直接给最终用户使用的,不能直接给客户带来价值的软件统称为中间件。
什么消息中间件?
关注于数据的发送和接收,利用高效可靠的异步消息传递机制集成分布式系统
什么是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)