Kafka 是一个开源的,分布式的,可扩展的,高性能的发布订阅模式的消息中间件,如果你要构建一个处理海量数据的系统,那么 Kafka 将会是一个非常好的选择,这篇文章我们将会讨论如何基于 Kakfa 构建一个发布订阅模式的程序。

Kafka 架构

这一节中,先来看看 Kafka 的基础架构以及相关术语,大体来说 Kafka 由下面几个组件组成。

  • Kafka Cluster  一个或者多个服务器组成的集群

  • Producer  一个用于发布消息的组件。

  • Consumer 一个用于获取并处理消息的组件。

  • ZooKeeper 一个中心化的协调组件,常用于保存分布式环境下各个节点的配置信息。

在 Kafka 中,数据的基本单元是 message,它是一个 key-value 键值对,kafka 会将所有的 message 转换为 byte[],值得注意的是:生产者消费者 以及 cluster 集群之间都是采用 tcp 协议通讯的,kafka 集群中的每一台机器都被称为代理(broker),你可以非常容易的向集群添加机器实现容量的横向扩展。

下面的图展示了 kafka 的基础架构。

kafka 中的 topic 表示 message 的逻辑集合,如果不明白的话,你可以认为 topic 就是 category (分类),category 下自然就是归类的 message,这些 message 是由 生产者 产生。

kafka server 中会包含一个或者多个 topics,每一个 topics 又可以包含一个或者多个 partitions(分区),partition 被定义为一个有序的消息序列,值得注意的是 partitions 是 kafka 能够动态扩展的关键,换句话说 partition 可以分布在多个 kafka server 上,具体操作流程为:kafka 中的 生产者  将 message 推送到指定的 topic,订阅该 topic 的 消费者 就可以拿到该消息。

Kafka 和 RabbitMQ 比较

Kafka 和 RabbitMQ 都是非常流行的,开源的 消息中间件,那什么时候应该选择 Kakfa 而不是 RabbitMQ 呢?主要考虑如下几点。

  • RabbitMQ 是由高性能语言 Erlang 编写的,它拥有丰富的 路由机制 和强大的 消息确认机制, 同时 RabbitMQ 还提供了一个可视化的 WebUI 界面,可以通过它监视 RabbitMQ 的运行状态,但如果你有大规模部署的需求,RabbitMQ 就没有 Kafka 好使了,因为后者的扩容只需要增加 partitions 就可以了。

  • RabbitMQ Cluster 会存在经典的 脑裂问题,需要使用单独的插件支持(federations)。

  • Kafka 在性能上远超 RabbitMQ,单节点的 Kafka 能够处理 10w/s 条记录,而 RabbitMQ 大概只能处理 2w/s 条记录。

构建 生产者 和 消费者

这一节我们来讨论如何为 Kafka 构建生产者和消费者,这就需要构建两个 Console 程序分别充当各自角色,大家可以用 nuget 安装一下 kafka-net,命令如下:


Install-Package kafka-net
  • 构建 生产者 Console

static void Main(string[] args){string payload ="Welcome to Kafka!";string topic ="IDGTestTopic";Message msg = new Message(payload);Uri uri = new Uri("http://localhost:9092");var options = new KafkaOptions(uri);var router = new BrokerRouter(options);var client = new Producer(router);client.SendMessageAsync(topic, new List<Message> { msg }).Wait();Console.ReadLine();}
  • 构建 消费者 Console

        static void Main(string[] args){string topic ="IDGTestTopic";Uri uri = new Uri("http://localhost:9092");var options = new KafkaOptions(uri);var router = new BrokerRouter(options);var consumer = new Consumer(new ConsumerOptions(topic, router));foreach (var message in consumer.Consume()){Console.WriteLine(Encoding.UTF8.GetString(message.Value));}Console.ReadLine();}

最后可以依次将 生产者消费者 程序启动起来,然后你就会看到 消费者 Console 上显示:Welcome to Kafka!

其实在开源世界中有太多的消息中间件,比如:RabbitMQ, MSMQ, IBM MQ Series 等等,现在的 Kafka 不仅仅是 消息中间件 了,而是用于大数据的 流式处理平台,Kafka 也常常用于 IOT 程序,日志聚合 和 其他低延迟,强消息保证 等场景,如果你的应用程序需要一个快速并可扩展的消息中间件,kafka 将会是一个非常好的选择,后续我会分享更多的关于 kafka 的文章。

译文链接:https://www.infoworld.com/article/3215165/how-to-use-apache-kafka-messaging-in-net.html

如何在 .NET 中使用 Kafka相关推荐

  1. Kafka深度解析(如何在producer中指定partition)(转)

    原文链接:Kafka深度解析 背景介绍 Kafka简介 Kafka是一种分布式的,基于发布/订阅的消息系统.主要设计目标如下: 以时间复杂度为O(1)的方式提供消息持久化能力,即使对TB级以上数据也能 ...

  2. 在Asp.Net Core中集成Kafka

    在我们的业务中,我们通常需要在自己的业务子系统之间相互发送消息,一端去发送消息另一端去消费当前消息,这就涉及到使用消息队列MQ的一些内容,消息队列成熟的框架有多种,这里你可以读这篇文章来了解这些MQ的 ...

  3. python flink kafka_Apache Flink:Python流API中的Kafka连接器,“无法加载用户类” - python...

    我正在尝试Flink的新Python流API,并尝试使用./flink-1.6.1/bin/pyflink-stream.sh examples/read_from_kafka.py运行我的脚本. p ...

  4. 居然还有人不知道如何在 IDEA 中生成 Maven 依赖关系图?

    点击上方"Java基基",选择"设为星标" 做积极的人,而不是积极废人! 每天 14:00 更新文章,每天掉亿点点头发... 源码精品专栏 原创 | Java ...

  5. 如何在SharePoint2010中添加Deep Zoom Image

    如何在SharePoint2010中添加Deep Zoom Image 应用范围 SharePoint 2010 Foundation:SharePoint 2010 Standard:SharePo ...

  6. php如何对数组进行分组,如何在PHP中对数组进行分组排序

    如何在PHP中对数组进行分组排序 发布时间:2021-01-04 16:28:51 来源:亿速云 阅读:98 作者:Leah 这篇文章将为大家详细讲解有关如何在PHP中对数组进行分组排序,文章内容质量 ...

  7. html中section与div,如何在html中的section标签内包含div标签

    我正在制作一个完整版块的页面网站,如this.每个页面都有自己的标签.目前我的网页有4个部分(呈现不同的背景颜色).如何在html中的section标签内包含div标签 我的第一部分有一个容器div, ...

  8. html img调用js,html调用js变量 如何在html中输出js文件中的变量

    html页面代码中怎么调用js变量?html页面代码中怎么调用js变量,例如 在html代码中插入js代码: a=取浏览你把index1.js 中的onReady 去掉,把index1.js改成 fu ...

  9. 如何在OpenCV中为InRange阈值选择颜色的最佳HSV值

    如何在OpenCV中为InRange阈值选择颜色的最佳HSV值 1. 效果图 2. 源码 参考 之前的博客介绍了如何使用Python,OpenCV通过HSV颜色空间转换检测对象,并进行轨迹追踪.怎么选 ...

最新文章

  1. Js——event详解
  2. 用C++实现二分查找
  3. math.atan_Python中带有示例的math.atan()方法
  4. 还发愁项目经验吗?基于Netty实现分布式RPC框架[附完整代码]
  5. git 小乌龟 配置_Git-Bash和TortoiseGit小乌龟客户端配置记录
  6. java基线_基线的概念-------权威
  7. php语法------04 php内置函数之与页面表单请求相关的内置函数对象
  8. 大数据时代:如何节省存储成本
  9. 不属于python第三方程序_安装 selenium 对于python而言属于一个第三方的模块
  10. Laravel的CURD操作
  11. 记我的一次重构——希望对新人有所帮助
  12. i5 9400f和i3 9100f哪个好
  13. YUV420转RGB888
  14. 关于Release版除法反汇编的小结
  15. zhu hao shi de shi
  16. ireport 循环_iReport制作报表1:iReport Designer的使用
  17. 计算机操作系统 电子科技大学 期末考试
  18. JS clientX、offsetX、pageX、screenX
  19. javascript表单三级联动
  20. 计算机毕业设计ssm图书馆自习室占座选座zg09h系统+程序+源码+lw+远程部署

热门文章

  1. 机器人出魔切还是三相_英雄联盟:辅助也要去上单,机器人布里茨玩法介绍
  2. Mybatis自定义SQL拦截器
  3. 常用模块之 time,datetime,random,os,sys
  4. 11. IDEA 在同一工作空间创建多个项目
  5. Python——逻辑运算(or,and)
  6. Memcached 在linux上安装笔记
  7. 30分钟掌握 C#7
  8. 设计模式21:State 状态模式(行为型模式)
  9. ⑥又是星期五,小试牛刀(编写定制标签)
  10. 如何判断一个字符串是不是纯数字