为什么Kafka不使用http?为什么消息中间件不直接使用http协议?

为什么Kafka不使用http?
kafka在tcp上使用二进制协议
有人问我们为什么不使用http。原因有很多,最好的是客户机实现者可以利用一些更高级的tcp特性--多路请求的能力,同时轮询多个连接的能力,等等。我们还发现许多语言中的http库非常破旧。
有没有明确的原因,因为这似乎没有说服力?

Kafka 强调性能。

通常 HTTP over TCP 带来的开销并不大,只要您将 header 保持在最小大小即可。

但是如果您有大量的小消息来回传输,则应考虑 HTTP 的开销。

您的消息越小,开销所占的比例就越大。

此外,基于文本的 HTTP 协议(protocol)还有很多特点。解析 HTTP 请求可能很复杂,因此比优化的二进制协议(protocol)慢。

(例如,即使是最简单的 libmicrohttpd 也很复杂。)

为什么消息中间件不直接使用http协议?

1

这个问题问得很准确,并不是说所有消息中间件一定不使用 http 协议,而是“不直接”使用 http 协议。以 RocketMQ 为例,使用的是 grpc 协议,本质是 protobuf(编码协议) + http2.0(传输协议),底层其实使用了 http 协议。当然还有一些消息中间件,是完全没有使用 http 协议,比如 kafka,直接使用了 TCP 协议。

消息中间件关注的一个核心点是吞吐量,所以对性能的要求比较高,而 http 协议,特别是 http1.x 版的协议,不具备多路复用的能力(http 2.0 具备),且消息头和消息体都比较大(http2.0 会做头部压缩,protobuf 则直接对消息做了编码压缩)。

此外,在消息传输过程中,我们更看重数据的压缩率,网络连接的复用情况,以及特定的优化手段。而 http 协议作为应用层协议,包含很多 MQ 场景可能并不需要的功能,但这些功能(比如额外的头部信息)可能会带来额外的开销;且作为应用层协议,http 缺乏一定的灵活性(越底层越灵活)。综上,http 协议不太适合用来直接作为消息中间件的通信协议。

2

因为http请求报文头和响应报文头是比较复杂的,包含了cookie,数据的加密解密,状态码,响应码等附加的功能,但是对于一个消息而言,我们并不需要这么复杂,也没有这个必要,因为rabbitmq只是负责数据传递、存储、分发就够了,一定要追求高性能,尽量简洁、快速。

http大部分都是短连接,在实际的交互过程中,一个请求到响应很可能会被中断,中断以后也不会持久化,就会造成数据的丢失。这样就不适合在消息中间件中使用,因为消息中间件是一个长期的获取信息的过程,如果出现问题或故障,要进行持久化,目的是为了保证消息和数据的高可靠和高可用。

3

  1. http本身需要额外的数据量来描述协议,开销更大;
  2. http是一种无状态协议,需要而外的逻辑处理;
  3. http是请求/响应式,就是一问一答,而消息中间件需要分发消息,如果只是实现http server很难维护的;
  4. 消息中间件最重要的是保证幂等性。应用什么协议其实跟消息中间件的关系不大,还是在于性能问题。

HTTP 协议包含太多东西了。

中间件要的是效率:解析快、传输快,所以这个场景需要的是专用格式。

猜你喜欢

转载自blog.csdn.net/qq_22473611/article/details/128933952