前言
你好,我是喜欢刨根问底的小明不明。这么多消息件,我该这么选?这是一个技术选型问题。在软件工程中,不存在像“银弹”这样可以解决一切问题的设计、架构或软件,每一个软件系统,它都是独一无二的,你不可能用一套方法去解决所有的问题。
面对一个技术选型问题,作为工程师,往往会不由自主的陷入技术实现细节的泥潭中。比如,设计数据存储的时候,不由自主的就会想到如何根据业务来分库分表,是否需要做主从复制,如何解决复制延迟等很细节的问题。除此之外,我们还会考虑这项技术的性能、社区支持、扩展性、已知问题等等技术细节。这些问题重要吗?很重要,但不是在技术选型时首要考虑的问题。
让我们先掌握基本的技术选型方法论,再来分析市场上常见的消息队列:Kafka、RabbitMQ、RocketMQ。
技术选型方法论
影响技术选型最重要的因素排序:
业务 ( 产品+用户 ) > 团队( 人 + 组织架构 ) > 技术
业务——产品维度
- 短生命周期产品(快速交付,产品质量不高,使命结束代码抛弃)和长生命周期产品(公司主要收入来源,可用性、扩展性、可维护性、性能都要考虑)
- 探索型产品(探索新业务、新技术,质量要求高,周期短)和守成型产品(怎么熟悉怎么来,引新技术要符号老的方式)
- 边缘产品(适合新技术低成本试错)和生命线产品(稳妥优先,采用保守方案)
业务——用户维度
- 浏览器版本(前端噩梦,要对用户问卷调查)
- 可访问性(比如用户有没有残疾人)
- 国际化(初期不考虑,后期前端噩梦+1)
- 💯访问频率(对技术选型都有很大影响!!!)
团队维度
- 技术背景(优先考虑现有的成熟技术体系)
- 团队规模(人多才能考虑,专门有团队去开发中间件等基础组件)
- 组织架构(考虑与其他团队技术的匹配程度、运维层面的支持)
- 人员流动(离职人员带走的相关技术对团队的建设影响很大)
技术维度
- 功能
- 性能
- 社区支持(社区越活跃,Bug率越低,生态兼容性越高,问题解决效率越高)
- 可扩展性
- 可定制性
- 已知问题和约束
作为架构师,如何解决这些问题?没什么好的办法,也没啥捷径。只有一边督促自己不断学习新技术,自己能够上手使用;另外一边结合团队实际情况,规划新技术的预研和落地步骤,不断的去尝试新事物。
常见误区
- 跟风:舆论驱动或者粉丝驱动
- 个人技术影响力驱动选型
- 拍脑袋选型
- 想一次性匹配最完美的选型
- 无度量评价:无验证式选型
- 领导主导:话语权驱动
消息队列选型
消息队列产品及格线:
- 消息的可靠传递:确保不丢消息;
- Cluster:支持集群,确保不会因为某个节点宕机导致服务不可用,当然也不能丢消息;
- 性能:具备足够好的性能,能满足绝大多数场景的性能要求。
消息队列第一梯队RabbitMQ、RocketMQ、Kafka
RabbitMQ
产生背景
电信行业系统之间的可靠通信设计
特点
- 轻量级
- 小众的编程语言:Erlang 语言编写
- 支持 AMQP
- 支持多种编程语言
特色
RabbitMQ 一个比较有特色的功能是支持非常灵活的路由配置,和其他消息队列不同的是,它在生产者(Producer)和队列(Queue)之间增加了一个 Exchange 模块,你可以理解为交换机。
这个 Exchange 模块的作用和交换机也非常相似,根据配置的路由规则将生产者发出的消息分发到不同的队列中。路由的规则也非常灵活,甚至你可以自己来实现路由规则。基于这个 Exchange,可以产生很多的玩儿法,如果你正好需要这个功能,RabbitMQ 是个不错的选择。
问题
- 消息堆积的支持不好
- 第一梯队中性能最低
- 编程语言 Erlang学习曲线非常陡峭,扩展和二次开发需要考虑慎重
RocketMQ
经历过多次“双十一”考验,它的性能、稳定性和可靠性都是值得信赖的。
RocketMQ 对在线业务的响应时延做了很多的优化,大多数情况下可以做到毫秒级的响应,如果你的应用场景很在意响应时延,那应该选择使用 RocketMQ。
每秒钟大概能处理几十万条消息。
缺点
作为国产的消息队列,相比国外的比较流行的同类产品,在国际上还没有那么流行,与周边生态系统的集成和兼容程度要略逊一筹。
这也是他的优点RocketMQ 有非常活跃的中文社区。
Kafka
产生背景
用于处理海量的日志
优点
- Kafka 与周边生态系统的兼容性是最好的没有之一,尤其在大数据和流计算领域,几乎所有的相关开源软件系统都会优先支持 Kafka。
- 性能最好:设计上大量使用了批量和异步的思想,因此Kafka 的性能,尤其是异步收发的性能,是三者中最好的。
性能是优势也是短板
批量设计,导致响应时延比较高,因此不太适合在线业务场景。
当客户端发送一条消息的时候,Kafka 并不会立即发送出去,而是要等一会儿攒一批再发送,在它的 Broker 中,很多地方都会使用这种“先攒一波再一起处理”的设计。
参考文献
- 技术选型:如何构建技术选型方法论
- 技术选型方案指南
- 极客时间——李玥老师的消息队列高手课