中间件
解决系统之间调用问题,a到b调用,改为多下游,就要改a项目,解耦。
上游发给下游数据,上游得等待下游返回,要是下游反应比较慢,这会消耗上游的资源,上游直接给中间件发,以后的事儿中间件负责,失败重试功能,还有削峰填谷。
选型
activeMQ和rabbitMQ单机吞吐量万级,rocketMq和kafka是10w级。
activeMQ会丢数据,社区不活跃。rabbitMq,scala开发,时效性比较强。
- 现在选型基本是在rocketMQ和kafka中选择,kafka业内标准,社区活跃。rocketMQ可以阿里云买服务直接用。
- zk和nameserver cp和ap。
- 下游消费,kafka是拉,rocketMQ是推,推的多了下游收不了。
kafka
副本保证高可用,分片保证吞吐性能。依赖zk。
-
消息丢失
- 上游发消息
发送kafka失败,设置retries参数,设置重试次数。ack 0 直接返回。 1 主节点写完返回。all主节点返回,并同步到副本后返回。 - 下游接受
关闭自动offset,处理完业务在手动提交。
- 上游发消息
-
幂等,重复消费
唯一索引,或者事务加锁。 -
消息有序
topic同key,固定分片。
下游逻辑:mysql事务加锁,redis锁,单线程池。 -
数据保留策略
过期时间,存储大小。 -
队列挤压
下游consumer导致,先恢复consumer,停止kafka。紧急扩容,扩容分片,队列,开启kafka,跑完,恢复。 -
高性能
架构,主题分片实现高可用。
日志,格式随着版本越来越利用批量处理,顺序写+写入系统页缓存保证写入效率。
数据,会对传递的数据进行压缩。
请求数,发送端分为两个线程一个做缓存一个做发送,会进行请求合并发送。
对象复制,读用MappedBuffer减少用户态和内核态数据复制。写用FileChannel.transTo减少数据复制。
rockmq
保证数据发送到mq不丢失。
mq有half消息机制,客户端向mq发送消息会先发一个half消息,mq接受到half消息后放进入一个half队列里,返回ack。这时候客户端再处理自己的数据,执行完会再和mq发通知,是执行还是回滚。如果是执行,mq会把half队列的数据标记为执行,把数据放到正常的mq队列中,通知下游,如果是回滚,mq会把half队列里这个数据标记为删除。如果上游没有及时通知mq怎么处理half,mq会有在超时过后,定期的去向上游发消息确认怎么处理,如果发了15次,都没有反馈,就执行删除。
社区活跃,微信群,钉钉群方便沟通,java语言开发对java开发友好。
链路追踪,监控,权限控制都原生支持。topic过多不会影响到性能。不依赖zk。可靠性方面,kafka是异步刷盘,rock支持异步和同步,灵活使用。
网友评论