本文共 1717 字,大约阅读时间需要 5 分钟。
消息中间件介绍
1. 消息中间件产生的背景
- 在网络通讯中,Http请求默认采用同步请求方式,基于请求与响应模式。
- 在客户端与服务器进行通讯时,客户端调用服务端接口后,必须等待服务器端完成处理后返回结果给客户端才能继续执行,这种情况属于同步调用方式。
- 如果服务器端发生网络延迟、不可达(宕机)的情况,可能客户端也会受到影响。一般来说我们会做好服务降级、熔断、隔离、限流等,这些虽然是微服务必做的,但这有点治标不治本,仅仅是解决了阻塞问题,并没有达到我们正常调用服务而不影响客户端的效果。
- 使用消息中间件后,只需要将消息写入队列,然后给客户端响应;消费者会自己消费队列中的消息。
2. 网络通讯采用同步方式
- 优点:可以及时响应数据给客户端,整个过程是同步的
- 缺点:可能会导致程序阻塞等待,效率比较低
3. Http协议同步接口调用补偿机制
问题:如果A服务调用B服务不通的情况下,如何保证数据一致性问题?
- 传统的Http方式,采用
补偿机制(重试)
,如果重试几次还是调不通,则存放日志表中,使用定时Job
重试。 - 要注意的是,服务端应该考虑网络延迟提交数据
幂等性
问题,防止接口重复调用。可以使用全局id
或者tocken
区分请求。
4. 消息中间件概述
消息中间件是分布式系统中重要的组件,主要解决应用解耦
,异步消息
,流量削锋
,消息通讯
等问题。实现高性能,高可用,可伸缩和最终一致性架构。目前使用较多的消息队列有ActiveMQ、RabbitMQ、ZeroMQ、Kafka、MetaMQ、RocketMQ等。
异步消息: 调用的服务不在线或繁忙,可以将消息缓存,待服务可用时再调用。
流量削锋: 在流量高峰期减轻流量、例如在
秒杀系统
中使用。
5. JMS规范
JMS是Java消息服务(Java Message Service)的缩写,是一个Java平台中面向消息中间件的API。
误区:
消息队列是消息中间件的说法是错误的,消息指的是生产者和消费者之间传递的数据,而队列是存放消息数据的集合,因此被叫做消息队列;而消息中间件包含消息队列和发布/订阅(主题)。
角色划分:
- 提供者:实现JMS规范的消息中间件服务器
- 客户端:发送或接收消息的应用程序
- 生产者/发布者:创建并发送消息的客户端
- 消费者/订阅者:接收并处理消息的客户端
- 消息:应用程序之间传递的内容
- 消息模式:在客户端之间传递消息的方式,JMS中定义了
主题
(pub/sub 即发布/订阅)和队列
(p2p 即点对点)两种模式。
点对点(p2p)模式:
P2P的特点:
- 每个消息只有一个消费者(Consumer)(即一旦被消费,消息就不再在消息队列中)
- 发送者和接收者之间在时间上没有依赖性,也就是说当发送者发送了消息之后,不管接收者有没有正在运行,它不会影响到消息被发送到队列
- 接收者在成功接收消息之后需向队列应答成功 如果你希望发送的每个消息都应该被成功处理的话,那么你需要P2P模式。

发布与订阅(pub/sub)模式:
Pub/Sub的特点:
- 每个消息可以有多个消费者
- 发布者和订阅者之间有时间上的依赖性。针对某个主题(Topic)的订阅者,它必须创建一个订阅者之后,才能消费发布者的消息,而且为了消费消息,订阅者必须保持运行的状态。 为了缓和这样严格的时间相关性,JMS允许订阅者创建一个可持久化的订阅。这样,即使订阅者没有被激活(运行),它也能接收到发布者的消息。
- 如果你希望发送的消息可以不被做任何处理、或者被一个消息者处理、或者可以被多个消费者处理的话,那么可以采用Pub/Sub模型

5. 消息队列异步通讯与同步通讯区别
- 串行方式(同步): 总共耗时150ms

- 并行方式(发送邮件和短信采用异步,本质还是同步): 总共耗时100ms

- 消息队列(异步) 总共耗时55ms,注册信息写入消息队列后就响应给客户端,比串行提高了近3倍,比并行提高了近2倍
6. 使用场景(流量削峰)

------------------------------------------------------- 学习不易 ,需要坚持 -------------------------------
转载地址:http://agqsz.baihongyu.com/