MQ
简介
消息处理队列,MessageQueue,是分布式系统中常见的重要组件,主要用于解耦,异步消息,流量削峰等问题。
常见的消息中间件有JMS(java message service)、ActiveMQ、RabbitMQ、Kafka、RocketMQ。
消息中间件:消息通信的桥梁。
常见的业务场景
-
消息异步处理
-
应用解耦
例如订单系统中用户下单后,订单系统处理完成后将消息写入消息队列,返回用户订单成功。 库存系统消费消息队列中消息,订阅模式获取下单消息,库存系统根据下单消息进行库存操作。
-
流量削峰
1、秒杀、团购,根据用户请求设置进队列人数,超过队列长度则抛弃用户。 2、根据消息队列的请求消息在做后续处理。
-
日志处理
日志采集客户端对Kafka消息队列写入,日志处理应用对消息进行消费。 1、Kafka:接收用户日志的消息队列。 2、LogStash:日志解析,统一成JSON格式输出给Elasticsearch。 3、Elasticsearch:实时日志分析服务的核心技术,一个schemaless,实时的数据存储服务,通过index组织数据,兼具强大的搜索和统计功能。 4、Kibana:居于Elasticsearch的数据可视化组件,超强的数据可视化能力,是大多数公司选择ELK stack的重要原因。
-
消息通讯
1、点对点通讯 2、聊天室通讯,订阅公众号模式。
JMS
简介
消息队列的java规范JMS。JMSAPI是一个消息服务的标准/规范,允许应用程序组件基于javaEE平台创建、发送、接收和读取消息。它使得分布式通讯解耦,消息服务更加可靠以及异步性。
JMS常见的两种模式
P2P生产消费模式: 1、只有一个生产者和消费者,消息一旦被消费者消费,其他消费者将无法消费。 2、没有时间上的依赖模式,不管现有生产者还是先有消费者都不影响消费者消费消息。 3、接收者在消费成功后需要向队列应答成功。 PubSub发布订阅模式: 包含三个角色,主题Topic、发布者Publisher、订阅者Subscriber多个发布者将消息发送到主题中系统将消息传递给多个订阅者。 1、只有一个发布者,但是可以有多个消费者(订阅者)。 2、只要消息发布,所有的订阅者都可以看到发布内容。 3、有时间上的依赖关系,要求必须订阅者先订阅,然后发布者发布消息后才能被订阅。 4、为了消费消息订阅者必须保持阅读状态。
消费消息
在JMS中消息的生产和消费都是异步的。对于消费者来说,JMS的消费者可以通过两种方式来消费消息。
-
同步
订阅者或者接受者通过receive方法来接收消息,receive方法在接收到消息之前或者超时之前将一直阻塞。
-
异步
订阅者或者接收者可以注册一个消息监听器。等消息到达后,系统自动调用监听器的onMessage方法。
JNDI:java命名和目录接口,是一种标准的java命名系统接口。可以在网络上查找和访问服务。通过指定一个资源名称,该名称对应于数据库或者命名服务中的一个记录,同时返回资源链接监理所需要的信息。
JNDI和JMS中起到查找和访问发送目标或者消息来源的作用。
JMS编程模型
1、connectionFactory
创建connnection对象工程,针对两种不同的JMS消息模型,分别有QueueConnectionFactory和TopicConnectionFactory,两种。可以通过JNDI来查找
COnnectionFactory对象。
2、Destination
Destination的意思是消费生产者的消息送达目标或者消息消费者峰消息来源。对于生产者就来说它的Destination是某个队列或者主题,对与消费者来说
Destination指的是队列或者主题(消息来源)。
3、Connection表示客户端和JMS系统之间建立的链接。(TCP/IP socket的包装)Connection可以产生一个或者多个Session。跟ConnectionFactory一样,
connection也是两种。QueueConnection和TopicConnection。
4、Session是操作消息的接口。可以通过Session创建生产者,消费者,消息等。Session提供了事务的功能。当需要使用Session发送/接收多个消息时,可以经
这些发送/接收动作放到同一个事物中,也分QueueSession和TopicSession。
5、消息的生产者,由Session创建并用于并作用于将消息发送到Destination,同样消息生产者分为两种:QueueSender和TopicPublisher。可以调用消息生产者的方法(send或者publish方法)发送消息。
6、消息消费者有session创建,用于接收被发送到Destination的消息。两种类型:QueueReceiver和TopicSubscriber。可分别通过Session的
CreatDurableSubscriber方法来创建持久化的订阅者。
7、MessageListener,消息监听器如果注册了消息监听器,一旦消息到达,将自动调用监听器的onMessage方法。
ActiveMQ
简介
ActiveMQ时qpache出品,完全支持JMS1.1和J2EE1.4规范的JMS provider实现。
特性
- 多种语言和协议编写客户端。
- 完全支持JMS1.1和J2EE1.4。
- 对Spring的支持,ActiveMQ可以很容易内嵌到Spring系统中。