62

MQ(6) —— Nsq vs Kafka

 2年前 阅读数 65
以下为 快照 页面,建议前往来源网站查看,会有更好的阅读体验。
原文链接: http://bridgeforyou.cn/2018/10/02/Nsq-6-Nsq-vs-Kafka/?amp%3Butm_medium=referral

Nsq vs Kafka

正如之前说的,Nsq是一款极简的消息中间件,通过学习Nsq,我们可以通过对比的方式,学习其他的Mq。

这一节,就让我们在对比中,学习另一种Mq,Kafka,在对比中,加深对Mq的理解。

首先,先放上这两者的架构图。

Nsq:

RneIVrB.gif

Kafka:

7vUrme7.png!web

在第一篇文章里,我演示了nsq是如何从一条队列,不断的解决各种问题,最后成为一个中间件的。

同样,对于Kafka,它在演化为一个靠谱的中间件的过程中,也需要解决很多类似的问题。

1、如何让一个topic的消息,能够被多个消费者实例消费

在nsq,采用的是channel的方式,而kafka,则是引入了”消费者组“的概念: JVVreub.jpg!web

2、如何让mq、生产者、消费者能够自动发现对方

我们知道,这需要一个类似于注册中心的中间件,nsq用的是nsqlookup,而kafka则直接采用了zookeeper:

Bja2AnI.png!web

3、如何实现集群

nsq的集群比较”另类“,让每个生产者自己配套一个nsq,kafka的集群就比较”正常“,正如上面架构图展示的: 7vUrme7.png!web

另外,在一些实现细节上,两者也有所不同。

1、内存 vs 磁盘

Nsq把消息放到了内存,只有当队列里消息的数量超过 --mem-queue-size 配置的限制时,才会对消息进行持久化。

而Kafka,则直接把消息存储到磁盘中。

存储到磁盘?这样效率岂不是很低?Kafka知道大家有这样的疑虑,因而在它的官方文档里,写了一大段话来平息大家对磁盘存储的”怨恨“: Kafka - Design File System

大概意思是,我们对磁盘的用法做了改进,使得使用磁盘的性能比人们想象中的要快很多,不过里头的原理太过高深,还附上了篇论文,哀家没看懂,就不在这里和大家瞎比比了 …..

Kafka觉得,反正最后也要进行持久化的,与其在内存不足的时候,匆匆忙忙去进行刷盘,不如直接就把数据放进磁盘:

rather than maintain as much as possible in-memory and flush it all out to the filesystem in a panic when we run out of space, we invert that. All data is immediately written to a persistent log on the filesystem without necessarily flushing to disk. In effect this just means that it is transferred into the kernel’s pagecache.

嗯,貌似有点道理,大家有兴趣的可以点链接进去看看。

2、push vs pull

对于选择push还是pull,这个没有一个唯一的答案,各有利弊。

push

  • 优点:延时小,几乎可以做到实时
  • 缺点:消费者端不好做流控 很难做批量推送,不知道要推送多少合适
  • 解决思路:参考之前文章讲的nsq的流控策略

pull

  • 优点:消费者可以自己把握节奏
  • 缺点:
    • 延时大
    • 消费者可能经常有空pull,即pull不到消息,造成浪费
  • 解决思路:Kafka采用的是阻塞式pull
To avoid this we have parameters in our pull request that allow the consumer request to block in a “long poll” waiting until data arrives

Kafka同样写了一大段文章,来解释他们为什么要采用pull: Kafka: Push vs Pull

3、数据备份

Nsq只把消息存储到一台机器中,不做任何备份,一旦机器奔溃,磁盘损坏,消息就永久丢失了,Kafka则通过partition的机制,对消息做了备份,增强了消息的安全性。

4、无序 vs 支持有序

Nsq不支持顺序消费,原因已经在之前提过:

比如说channel A里现在有两条消息,M1和M2,M1先产生,M2后产生,channel A分别将M1和M2推送给了消费者 C1和C2,那么有可能C1比C2先处理完消息,这样是有序的;但也有可能,C2先处理了,这样M2就比M1先被处理,这样就是无序的。

而Kafka则支持顺序消费,具体可以参考 Kafka: Ordering Messege

要使用Kafka的顺序消费功能,必须满足几个条件:

  • 要被顺序消费的消息,必须都放到一个partition里面
  • partition只能被消费者组里的一个消费者实例消费

比如,topic A的消息 都要顺序消费,那么topic A只允许有一个partition;

又比如,topic A的消息里面,userId相同的消息,要被顺序消费,那么就要根据userId字段做hash,保证相同userId的消息,去到同一个partition。

5、消息投递语义

之前说过,消息投递语义(Message Delivery Semantics)有三种:

  • 最多一次(At most once)
  • 至少一次(At least once)
  • 准确一次(Exactly once)

Nsq只支持至少一次,也就是说,消息有可能被多次投递,消费者必须自己保证消息处理的幂等性。

而Kafka则支持准确一次,具体可以参考下面两篇文章:


猜你喜欢

  • 42

    php-nsq php-nsq 是nsq的php客户端,采用c扩展编写,性能和稳定性。 安装 : 请提前安装libevent Dependencies: libevent (apt-get install libevent-dev ,yum install libevent-devel) 1....

  • 35
    • 微信 mp.weixin.qq.com 2年前
    • 快照

    NSQ最佳实践

  • 77
    • 微信 mp.weixin.qq.com 2年前
    • 快照

    NSQ 最佳实践

    目前,全新的异步任务服务每天高效稳定的为唱吧提供数亿次的调用。服务器团队用全新的方式重新定义了异步任务实现方式,以为云计算而生的NSQ、成熟的PHP执行者PHP-FPM、自主开发的中间件NSQProxy以及admin管理后台共同组成了异步任务的队...

  • 24
    • studygolang.com 2年前
    • 快照

    NSQ源码-Nsq客户端

    看完lookupd和nsqd之后我们再来看下nsq client端的代码。 我是想把nsq系统完完整整的看一遍,从而对他形成一个更整体的 认识。对message queue来说他的client端就是生产者和消费者,生产者负责想nsq中投递消息,消费者负责...

  • 29
    • studygolang.com 2年前
    • 快照

    NSQ源码-NSQD

    看完了nsqlookupd我们继续往下看, nsqd才是他的核心. 里面大量的使用到了go channel, 相信看完之后对你学习go有很大的帮助.相较于lookupd部分无论在代码逻辑和实现上都要复杂很多. 不过基本的代码结构基本上都是一样的, 进...

  • 47
    • studygolang.com 2年前
    • 快照

    NSQ源码-nsqlookupd

    为什么选择nsq 之前一直在用erlang做电信产品的开发,对erlang的一些生态也比较了解,和erlang相关的产品在互联网公司使用最多的应该就是rabbitmq了,也许很多人听说过erlang就是因为他们公司在使用rabbitmq。在之前也看过一点...

  • 46
    • www.tuicool.com 1年前
    • 快照

    NSQ v0.1.5 源码分析

    NSQ 是实时的分布式消息处理平台,其设计的目的是用来大规模地处理每天数以十亿计级别的消息。NSQ 具有分布式和去中心化拓扑结构,该结构具有无单点故障、故障容错、高可用性以及能够保证消息的可靠传递的特征,是一个成熟的、已在大规模...

  • 64
    • www.tuicool.com 1年前
    • 快照

    nsq源码review:go-nsq producer

    nsq是一个实时分布式的消息队列平台。 核心部分是一个叫nsqd的模块,它负责接收和转发消息。同时在go-nsq的包中,提供了consumer和producer的核心接口。在读nsq源码的时候,很好奇它的数据是怎么从producer给到了consumer的,于...

  • 64
    • www.tuicool.com 1年前
    • 快照

    使用NSQ(附Golang代码)

    上篇文章已经了解了消息中间件相关的知识,这篇文章学习一下Golang语言编写的知名消息中间件 NSQ 。 nsq最初是由bitly公司开源出来的一款简单易用的消息中间件,它可用于大规模系...

  • 45
    • www.tuicool.com 1年前
    • 快照

    golang nsq

    1.安装 https://nsq.io/deployment/installing.html 2.快速入门 在一个终端中,运行

关于极客头条


聚合每日国内外有价值,有趣的链接。

AD