遇到的一些问题
- 交换器队列绑定有问题
- 客户端代码编写问题
- 没有选择合适的交换器类型
- 客户端与MQ连接阻塞
- 网络分区的发生与恢复方案
- 非持久化镜像队列同步异常
性能优化
- 优化网络配置(禁用Nagle算法,增加TCP缓存区大小)
- 客户端代码优化(事务,普通confirm,批量confirm和异步confirm)
- publisher confirm和comsumer ack,prefetchCount数值
- 镜像队列的使用拉低整体性能
- Erlang Hipe compile
- 避免触发流控机制影响性能
消息传输保障
-
生产者publisher confirm机制确保消息可靠传输到MQ中
-
生产者配合使用mandatory或者备份交换器确保消息能够从交换器路由到队列中,进而能够保存下来而不会被丢弃
-
交换器、消息、队列需要进行持久化处理
-
消费者在消费消息的同时需要将autoAck设置为false,手动确认消息已经被正确消费
RabbitMQ没有消息去重机制,需要业务方根据自身的业务特性进行去重
运维监控
集群搭建
节点故障恢复
集群监控
- 通过HTTP API接口提供监控数据
- 通过客户端提供监控数据
- 元数据管理与监控
跨级群和WAN部署
使用Federation和shovel可跨越集群(网络状态良好的LAN)界限,实现WAN部署
项目中待改善的细节
- 使用rabbitmq达到一定规模后,可根据业务功能和场景进行归类拆分,为之分配不同vhost
- 用户是访问控制的基本单元,单用户可跨多个vhost进行授权,需合理配置用户权限
- 使用aliveness-test程序配合AMQPPing一起全面监控RabbitMQ服务
- 加强元数据管理与监控,提供给业务方使用的用户只有可读可写权限,不能够变更元数据信息
-
目前MQ程序异常是单纯通过守护脚本拉起,这其中逻辑需要完善,确保在启动时最后关闭的节点是第一个启动的
- 没有对重要业务加以区分,制作备份交换器
- 没有监控队列中可能存在的消息积压的情况,运维部分薄弱
- 可考虑预先分配创建元数据资源,避免人为因素,代码缺陷导致的MQ使用问题
- 格式化使用reset操作而非删除menisa数据
消息追踪和问题定位
- 使用firehose和tracing插件追踪消息的处理过程
- 在开启web管理插件的前提下,登陆操作界面查看问题
- 合理利用amq.rabbitmq.log交换器,过滤不同级别日志信息
- 查看日志文件分析定位问题
- 使用操作管理命令(rabbitmqctl)和HTTP API接口