RabbitMQ 队列使用场景
1. 简单队列(Simple Queue)
- 场景描述:简单队列是最基础的队列模式,由一个生产者向一个队列发送消息,一个消费者从该队列接收消息,是一对一的消息传递模式。
- 适用场景
- 任务简单且独立:例如系统中的日志收集任务,生产者将日志信息发送到队列,消费者从队列中取出日志进行存储或分析,每个日志消息的处理相对独立,不需要复杂的路由和分发机制。
- 快速搭建测试环境:在开发和测试阶段,用于快速验证消息传递的基本功能,确保生产者和消费者之间的通信正常。
2. Work 队列(工作队列)
- 场景描述:也称为任务队列,一个生产者将消息发送到队列,多个消费者从该队列中竞争获取消息进行处理,实现任务的负载均衡。
- 适用场景
- 耗时任务处理:如图片处理、视频转码等任务,生产者将大量的任务消息发送到队列,多个消费者并行处理这些任务,提高整体处理效率。
- 批量数据处理:当需要处理大量数据时,生产者将数据分割成多个小任务发送到队列,多个消费者同时处理这些小任务,加快数据处理速度。
3. Publish/Subscribe(发布/订阅)队列
- 场景描述:生产者将消息发送到交换机,交换机将消息广播到所有绑定到该交换机的队列,每个队列都有自己的消费者,实现一对多的消息传递。
- 适用场景
- 系统通知:例如电商系统中,当订单状态发生变化时,生产者将订单状态变更消息发送到交换机,多个消费者(如短信通知服务、邮件通知服务、APP 推送服务等)分别从各自绑定的队列中获取消息,进行相应的通知操作。
- 日志分发:系统产生的日志信息可以通过发布/订阅模式分发到不同的队列,供不同的消费者进行处理,如存储到数据库、进行实时分析等。
4. Routing(路由)队列
- 场景描述:生产者将消息发送到直连交换机(Direct exchange),并指定一个路由键(routing key),交换机根据路由键将消息路由到绑定了相同路由键的队列。
- 适用场景
- 系统监控:在分布式系统中,不同类型的监控指标(如 CPU 使用率、内存使用率、网络带宽等)可以作为不同的路由键,生产者将监控数据发送到直连交换机,不同的消费者根据自己关注的监控指标绑定相应的路由键,从对应的队列中获取数据进行处理。
- 业务分类处理:例如电商系统中,根据订单的类型(如普通订单、团购订单、预售订单等)作为路由键,生产者将订单消息发送到直连交换机,不同的业务处理模块根据订单类型绑定相应的路由键,从对应的队列中获取订单消息进行处理。
5. Topic(主题)队列
- 场景描述:生产者将消息发送到主题交换机(Topic exchange),并指定一个主题路由键(topic routing key),交换机根据主题路由键的规则将消息路由到绑定了匹配主题的队列。主题路由键可以使用通配符
*
(匹配一个单词)和#
(匹配零个或多个单词)。 - 适用场景
- 新闻分类订阅:在新闻系统中,新闻的分类可以作为主题路由键,如
sports.basketball
、sports.football
、entertainment.movie
等。用户可以根据自己的兴趣订阅不同的主题,生产者将新闻消息发送到主题交换机,交换机根据主题路由键将消息路由到订阅了相应主题的队列,用户从队列中获取感兴趣的新闻。 - 物联网数据处理:在物联网系统中,不同设备产生的数据可以根据设备类型、地理位置等信息作为主题路由键,如
device.sensor.temperature
、device.camera.image
等。不同的数据分析模块可以根据自己的需求订阅不同的主题,从对应的队列中获取数据进行分析。
- 新闻分类订阅:在新闻系统中,新闻的分类可以作为主题路由键,如
6. RPC(请求回复)队列
- 场景描述:客户端(生产者)将请求消息发送到队列,服务端(消费者)从队列中获取请求消息进行处理,并将处理结果通过另一个队列返回给客户端。
- 适用场景
- 远程服务调用:在分布式系统中,当一个服务需要调用另一个服务的方法时,可以使用 RPC 队列模式。客户端将请求消息发送到队列,服务端从队列中获取请求并执行相应的方法,将执行结果返回给客户端。
- 分布式计算:在分布式计算环境中,客户端将计算任务发送到队列,多个计算节点(服务端)从队列中获取任务进行计算,并将计算结果返回给客户端。
RabbitMQ 交换机使用场景
1. Direct exchange(直传交换机)
- 场景描述:根据消息的路由键将消息路由到绑定了相同路由键的队列。
- 适用场景
- 基于用户 ID 的消息分发:在社交系统中,每个用户有一个唯一的 ID,生产者可以将消息发送到直连交换机,并以用户 ID 作为路由键,不同用户的消息处理队列绑定到相应的用户 ID 路由键,确保消息准确地发送到目标用户的队列。
- 错误日志分类处理:系统产生的错误日志可以根据错误类型(如数据库错误、网络错误、业务逻辑错误等)作为路由键,生产者将错误日志消息发送到直连交换机,不同的错误处理模块根据错误类型绑定相应的路由键,从对应的队列中获取错误日志进行处理。
2. Fanout exchange(广播交换机)
- 场景描述:将接收到的消息广播到所有绑定到该交换机的队列,不考虑消息的路由键。
- 适用场景
- 系统配置更新通知:当系统的配置信息发生更新时,生产者将配置更新消息发送到广播交换机,所有绑定到该交换机的队列的消费者都会接收到配置更新消息,从而及时更新自己的配置。
- 活动通知:在电商系统中,当有新的促销活动时,生产者将活动通知消息发送到广播交换机,所有相关的服务(如商品展示服务、购物车服务、订单服务等)都可以从各自绑定的队列中获取活动通知消息,进行相应的调整。
3. Topic exchange(主题交换机)
- 场景描述:根据消息的主题路由键和队列的绑定键的匹配规则将消息路由到相应的队列。
- 适用场景
- 金融市场数据订阅:在金融系统中,不同的金融产品(如股票、债券、期货等)和不同的市场指标(如价格、成交量、涨跌幅等)可以组合成不同的主题路由键,如
stock.AAPL.price
、bond.US10Y.volume
等。投资者可以根据自己的投资组合和关注的指标订阅不同的主题,生产者将金融市场数据发送到主题交换机,交换机根据主题路由键将数据路由到订阅了相应主题的队列。 - 物流信息跟踪:在物流系统中,不同的物流环节(如发货、运输、签收等)和不同的货物信息(如货物类型、目的地等)可以作为主题路由键,如
logistics.shipping.electronics
、logistics.delivery.NewYork
等。不同的物流参与方(如发货方、收货方、物流公司等)可以根据自己的需求订阅不同的主题,从对应的队列中获取物流信息。
- 金融市场数据订阅:在金融系统中,不同的金融产品(如股票、债券、期货等)和不同的市场指标(如价格、成交量、涨跌幅等)可以组合成不同的主题路由键,如
4. Headers exchange(header 交换机)
- 场景描述:根据消息的 headers 属性和队列的绑定键的匹配规则将消息路由到相应的队列,而不是根据路由键。
- 适用场景
- 基于元数据的消息分发:当消息的路由需要根据消息的元数据(如消息的优先级、消息的来源、消息的类型等)进行判断时,可以使用 header 交换机。例如,在一个多租户系统中,不同租户的消息可以通过设置不同的 headers 属性进行区分,生产者将消息发送到 header 交换机,不同租户的消息处理队列根据 headers 属性进行绑定,确保消息准确地发送到目标租户的队列。
- 复杂条件的消息过滤:当消息的路由规则比较复杂,无法用简单的路由键或主题路由键表示时,可以使用 header 交换机。例如,根据消息的多个属性进行组合判断,只有满足特定条件的消息才会被路由到指定的队列。
5. DelayExchange(插件开启延迟交换机)
- 场景描述:允许消息在指定的时间后才被路由到队列,实现消息的延迟处理。
- 适用场景
- 订单超时处理:在电商系统中,当用户下单后,如果在一定时间内没有完成支付,系统需要自动取消订单。可以将订单创建消息发送到延迟交换机,设置延迟时间为订单超时时间,当延迟时间到达后,消息被路由到相应的队列,消费者从队列中获取消息并执行订单取消操作。
- 定时任务调度:在系统中,有些任务需要在特定的时间执行,如定时数据备份、定时统计报表生成等。可以将任务消息发送到延迟交换机,设置延迟时间为任务执行时间,当延迟时间到达后,消息被路由到相应的队列,消费者从队列中获取消息并执行任务。