关于RabbitMQ的跨部门分发使用权限控制和规范总结

背景

在公司使用RabiitMQ进行消息分发时,如果仅仅是简单的一对一关系,开发起来非常容易,直接按照正常的分发和绑定即可。但是如果要进行生产、分发、消费,分别解耦,就需要制定一套完整的使用方案,并且对exchange、route、queue的命名要遵循一定的规范,需要对不同服务根据规范对名称进行写入和消费权限控制

场景举例

触发场景:用户下单成功,需要通知短信服务、库存服务、商家服务

生产者:订单服务

消费者:短信服务(告知用户下单成功)、库存服务(库存更新)、商家服务(新订单处理)

规范

  • 交换机exchange:e.service_name,比如用户订单服务e.user_order
  • 路由route:k.生产服务.消费服务.生成场景,比如订单服务创建订单时生产、短信服务消费k.order.sms.create_order
  • 队列queue:q.消费队列服务.生产队列服务.生成场景,比如订单服务创建订单时生产、短信服务消费q.sms.order.create_order

权限举例

订单服务:

  • 交换机写权限命名:^e\.order.*,代表只允许向e.order开头的交换机写入
  • 队列读权限命名:^q\.order.*,代表只允许读q.order开头的队列

方案对比

topic交换机:

优点:通过route自动实现分发,无需多次创建绑定

缺点:命名规范和权限无法同时保证

redirect交换机:

优点:可以通过指定route和queue绑定实现分发功能,命名规范和权限都可保证

缺点:无法自动分发,下游增加消费需手动新增绑定

最终方案

新服务订阅时按照命名规范创建queue和route,和对应exchange进行绑定,取消订阅时停止消费者服务后取消绑定即可。

假如某个服务是平台服务,无需特殊定制,比如sm,则可以把对应队列名后面的两个字段去掉:q.sms.order.create_order->q.sms