二十五 RocketMQ
1 消息队列介绍
消息队列,简称 MQ(Message Queue),它其实就指消息中间件,当前业界比较流行的开源消息中间件包括:RabbitMQ、RocketMQ、Kafka。(一个使用队列来通信的组件)它的本质,就是个转发器,包含发消息、存消息、消费消息的过程。最简单的消息队列模型如下:
2 消息队列的使用场景
消息队列(Message Queue)是一种在分布式系统中进行异步通信的方法,它允许应用程序之间发送和接收消息,而无需立即进行同步处理。消息队列的使用场景非常广泛,以下是一些常见的使用场景:
① 异步处理:
当一个应用需要执行耗时操作时(如发送邮件、处理图片、进行数据分析等),可以将这些操作放入消息队列中,由后台任务异步处理,从而避免阻塞主线程,提高应用的响应速度。
② 解耦:
在微服务架构中,不同的服务之间可能需要相互通信。通过消息队列,可以将这些服务解耦,使得它们可以独立地进行开发和部署。当一个服务需要调用另一个服务的功能时,只需将消息发送到队列中,然后由另一个服务从队列中取出消息并进行处理。
③ 流量削峰:
在高并发场景下,应用可能会在短时间内接收到大量的请求。如果直接将这些请求交给后台处理,可能会导致系统崩溃。通过将请求放入消息队列中,可以平滑地处理这些请求,避免系统过载。同时,后台可以根据处理能力,从队列中逐步取出消息进行处理。
④ 日志处理:
在分布式系统中,日志的收集和处理是一个重要的问题。通过将日志消息发送到消息队列中,可以集中地对这些日志进行存储、分析和处理。
⑤ 任务调度:
消息队列可以用于实现任务调度系统。例如,可以使用消息队列来触发定时任务、延迟任务或周期性任务。
⑥ 数据同步:
在分布式系统中,不同的服务或数据库之间可能需要保持数据的一致性。通过消息队列,可以实现数据的异步同步。当一个服务的数据发生变化时,可以将变化的信息发送到消息队列中,然后由其他服务从队列中取出信息并更新自己的数据。
⑦ 系统解耦和容错:
消息队列可以作为一个中间件,将不同的系统或组件连接起来。当某个系统或组件出现故障时,其他系统或组件可以继续从消息队列中取出消息进行处理,从而实现系统的容错性。
⑧ 消息广播和订阅:
消息队列支持发布/订阅模式,允许一个或多个消费者订阅某个主题(Topic),当有新消息发布到该主题时,所有订阅了该主题的消费者都会收到该消息。这种模式适用于需要广播消息的场景,如实时推送、新闻发布等。
⑨ 分布式事务:
在分布式系统中实现事务性操作是一个挑战。通过使用消息队列和补偿事务等机制,可以实现分布式事务的可靠执行。当一个操作失败时,可以通过发送补偿消息来撤销之前的操作,确保数据的一致性。
⑩ 数据收集和分析:
消息队列可以用于收集各种类型的数据(如用户行为数据、系统日志等),并将这些数据发送到大数据平台或数据仓库中进行进一步的分析和处理。
3 如何解决消息丢失问题
一个消息从生产者产生,到被消费者消费,主要经过这 3 个过程:生产者&