消息队列已经是互联网基石了,也是大厂重点考察的对象,下面我全面来详解消息队列核心应用@mikechen
消息队列
消息队列(Message Queue),它通过在消息的生产者/和消费者之间引入一个队列,来实现系统中不同组件之间的解耦。
如下图所示:
- 消息(Message):消息是消息队列中传递的数据单位,通常包含:消息内容、和一些元数据;
- 消息队列(Message Queue):这是存储消息的容器,生产者将消息发送到队列中,消费者从队列中读取消息;
- 生产者(Producer):生产者是消息的发送方,负责:创建和发送消息到消息队列中;
- 消费者(Consumer):消费者是消息的接收方,负责:从消息队列中读取和处理消息。
消息队列,可以用于实现异步通信、应用解耦、流量控制、和日志处理…….等技术,下面我分别详解@mikechen
异步通信
异步通信是一种通信模式,发送方在发送消息后不需要等待接收方处理消息,即可继续执行其他任务。
如下图所示:
这种方式,发送方不需要等待接收方处理完毕,可以在短时间内处理大量请求,提升系统的并发能力。
举个典型的例子:
比如:订单处理系统,当用户提交订单时,订单服务可以将订单信息发送到消息队列,然后立即返回响应。
后续的支付处理、库存更新、通知服务…..等,都可以异步地从消息队列中,读取订单信息、并处理。
以及,用户注册成功后,注册服务可以将邮件发送任务放入消息队列,邮件服务异步读取消息并发送邮件。
这些,都是非常典型的异步通信的例子。
应用解耦
应用解耦,是指系统的不同组件,通过消息队列进行通信,而不是直接调用从而实现组件之间的解耦。
如下图所示:
上游服务与下游服务,通过上图的“MQ消息队列”,实现了解耦。
如果是多个服务,服务之间不直接依赖,而是通过“MQ消息队列”来通信,这就实现了解耦。
比如:订单服务、支付服务、库存服务……等通过消息队列进行通信,各个服务可以独立开发/和维护。
这种方式,组件之间通过消息队列通信,提高系统的灵活性、和可维护性。
流量控制
流量控制:是通过消息队列对系统的请求进行限流、和削峰,防止系统过载。
如下图所示:
比如:在电商大促期间,大量用户同时发起抢购请求。
消息队列可以将这些请求在队列中,后端系统按处理能力逐步消费消息,这样,可以防止系统崩溃。
这就是我们经常谈到的“削峰填谷”,通过消息队列缓存请求,平滑地处理高峰流量,从而,保护好后端系统。
日志处理
日志处理:是通过消息队列收集、传输和处理系统生成的日志信息。
如下图所示:
比如:最典型的场景,就是各个应用,将日志信息发送到消息队列,比如:Kafka。
然后,日志处理系统从消息队列中读取日志,进行集中处理、和存储。
然后,以便进行进一步的分析和查询,例如,可以将日志存储到:Elasticsearch以支持全文搜索、和分析。
Kafka日志系统通过高吞吐量、分布式存储和灵活的消费者模型,为处理和分析大规模日志数据提供了强大的支持。