关于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