02丨这么多消息件,我该这么选?

392

前言

你好,我是喜欢刨根问底的小明不明。这么多消息件,我该这么选?这是一个技术选型问题。在软件工程中,不存在像“银弹”这样可以解决一切问题的设计、架构或软件,每一个软件系统,它都是独一无二的,你不可能用一套方法去解决所有的问题

面对一个技术选型问题,作为工程师,往往会不由自主的陷入技术实现细节的泥潭中。比如,设计数据存储的时候,不由自主的就会想到如何根据业务来分库分表,是否需要做主从复制,如何解决复制延迟等很细节的问题。除此之外,我们还会考虑这项技术的性能、社区支持、扩展性、已知问题等等技术细节。这些问题重要吗?很重要,但不是在技术选型时首要考虑的问题

让我们先掌握基本的技术选型方法论,再来分析市场上常见的消息队列:Kafka、RabbitMQ、RocketMQ

技术选型方法论

影响技术选型最重要的因素排序:

业务 ( 产品+用户 )   >   团队( 人 + 组织架构 )   >   技术

业务——产品维度

  • 短生命周期产品(快速交付,产品质量不高,使命结束代码抛弃)和长生命周期产品(公司主要收入来源,可用性、扩展性、可维护性、性能都要考虑
  • 探索型产品(探索新业务、新技术,质量要求高,周期短)和守成型产品(怎么熟悉怎么来,引新技术要符号老的方式
  • 边缘产品(适合新技术低成本试错)和生命线产品(稳妥优先,采用保守方案

业务——用户维度

  • 浏览器版本(前端噩梦,要对用户问卷调查
  • 可访问性(比如用户有没有残疾人
  • 国际化(初期不考虑,后期前端噩梦+1
  • 💯访问频率(对技术选型都有很大影响!!!)

团队维度

  • 技术背景(优先考虑现有的成熟技术体系)
  • 团队规模(人多才能考虑,专门有团队去开发中间件等基础组件)
  • 组织架构(考虑与其他团队技术的匹配程度运维层面的支持
  • 人员流动(离职人员带走的相关技术对团队的建设影响很大)

技术维度

  • 功能
  • 性能
  • 社区支持(社区越活跃,Bug率越低,生态兼容性越高,问题解决效率越高
  • 可扩展性
  • 可定制性
  • 已知问题和约束

作为架构师,如何解决这些问题?没什么好的办法,也没啥捷径。只有一边督促自己不断学习新技术,自己能够上手使用;另外一边结合团队实际情况,规划新技术的预研和落地步骤,不断的去尝试新事物。

常见误区

  • 跟风:舆论驱动或者粉丝驱动
  • 个人技术影响力驱动选型
  • 拍脑袋选型
  • 想一次性匹配最完美的选型
  • 无度量评价:无验证式选型
  • 领导主导:话语权驱动

消息队列选型

消息队列产品及格线:

  • 消息的可靠传递:确保不丢消息;
  • Cluster:支持集群,确保不会因为某个节点宕机导致服务不可用,当然也不能丢消息;
  • 性能:具备足够好的性能,能满足绝大多数场景的性能要求。

消息队列第一梯队RabbitMQ、RocketMQ、Kafka

RabbitMQ

产生背景

电信行业系统之间的可靠通信设计

特点

  • 轻量级
  • 小众的编程语言:Erlang 语言编写
  • 支持 AMQP
  • 支持多种编程语言

特色

RabbitMQ 一个比较有特色的功能是支持非常灵活的路由配置,和其他消息队列不同的是,它在生产者(Producer)和队列(Queue)之间增加了一个 Exchange 模块,你可以理解为交换机。 RabbitMQ.png 这个 Exchange 模块的作用和交换机也非常相似,根据配置的路由规则将生产者发出的消息分发到不同的队列中。路由的规则也非常灵活,甚至你可以自己来实现路由规则。基于这个 Exchange,可以产生很多的玩儿法,如果你正好需要这个功能,RabbitMQ 是个不错的选择。

问题

  • 消息堆积的支持不好
  • 第一梯队中性能最低
  • 编程语言 Erlang学习曲线非常陡峭,扩展和二次开发需要考虑慎重

RocketMQ

经历过多次“双十一”考验,它的性能、稳定性和可靠性都是值得信赖的。

RocketMQ 对在线业务的响应时延做了很多的优化,大多数情况下可以做到毫秒级的响应,如果你的应用场景很在意响应时延,那应该选择使用 RocketMQ。

每秒钟大概能处理几十万条消息。

缺点

作为国产的消息队列,相比国外的比较流行的同类产品,在国际上还没有那么流行,与周边生态系统的集成和兼容程度要略逊一筹。

这也是他的优点RocketMQ 有非常活跃的中文社区

Kafka

产生背景

用于处理海量的日志

优点

  • Kafka 与周边生态系统的兼容性是最好的没有之一,尤其在大数据和流计算领域,几乎所有的相关开源软件系统都会优先支持 Kafka。
  • 性能最好:设计上大量使用了批量和异步的思想,因此Kafka 的性能,尤其是异步收发的性能,是三者中最好的。

性能是优势也是短板

批量设计,导致响应时延比较高,因此不太适合在线业务场景

当客户端发送一条消息的时候,Kafka 并不会立即发送出去,而是要等一会儿攒一批再发送,在它的 Broker 中,很多地方都会使用这种“先攒一波再一起处理”的设计。

参考文献