如何在 .NET 中使用 Kafka

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/304134.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

傅里叶变换和拉普拉斯变换的物理解释及区别

傅里叶变换在物理学、数论、组合数学、信号处理、概率论、统计学、密码学、声学、光学、海洋学、结构动力学等领域都有着广泛的应用&#xff08;例如在信号处理中&#xff0c;傅里叶变换的典型用途是将信号分解成幅值分量和频率分量&#xff09;。傅里叶变换能将满足一定条件的…

Teleport 开源堡垒机的使用

公司的服务器可能会存在这样一种情况&#xff0c;具体的应用是部署在一个或多个内网服务器上&#xff0c;然后由一台外网服务器通过代理的方式对外提供服务&#xff0c;例如下图&#xff1a;我们如果需要进入到内网服务器进行操作就必须先要进入外网服务器&#xff0c;然后再远…

python拼图游戏_乐趣无穷的Python课堂

Python world/特慧编/你所认为的.........pythonpython&枯燥、无趣boring“安全”提示走进特慧编走进“python编程课”让我们进入真正的编程世界&#xff0c;培养逻辑数理思维&#xff0c;学习掌握python特色&#xff0c;让你的学习过程不再枯燥、不再无趣~~~下面跟着我的脚…

让 Python 更加充分的使用 Sqlite3

我最近在涉及大量数据处理的项目中频繁使用 sqlite3。我最初的尝试根本不涉及任何数据库&#xff0c;所有的数据都将保存在内存中&#xff0c;包括字典查找、迭代和条件等查询。这很好&#xff0c;但可以放入内存的只有那么多&#xff0c;并且将数据从磁盘重新生成或加载到内存…

techempower之Plaintext上7百万RPS

在Plaintext这项测试中第一阶梯的分隔线基本算是7百万RPS&#xff0c;Beetlex并没有到到这一阶梯停留在69X万RPS处&#xff0c;虽然只差那数万但在排名上让人感觉不爽。Beetlex在很多项测都微微领先aspcore,但在最基础项落下一点点的确让我感觉到不太满意&#xff0c;更希望Bee…

详解全排列算法

简介给定 {1, 2, 3, , , n}&#xff0c;其全排列为 n! 个&#xff0c;这是最基础的高中组合数学知识。我们以 n4 为例&#xff0c;其全部排列如下图&#xff08;以字典序树形式来呈现&#xff09;&#xff1a;我们很容易想到用递归来求出它的所有全排列。仔细观察上图&#xff…

VS2019 调试技巧之附加进程

C# 创建服务并附加到进程进行调试步骤一&#xff1a;在任务栏右键-》》点击任务管理器-》》选择服务&#xff0c;找到启动的进程PID或者WINR 进入cmd命令 输入 netstat -ano | find "进程端口" 找端口步骤二&#xff1a;VS中找到“调试”菜单&#xff0c;选择“…

sql同时向两个表插入数据_SQL入门-数据库和客户端的安装,表的创建和数据插入...

1、如何验证MySQL数据库安装成功按照上图操作打开SQL命令行客户端输入安装MySQL时设置的密码并按enter键&#xff0c;得到下图&#xff1a;如果有显示出来红框里的内容&#xff0c;就表示安装成功。红框里的内容表示的是MySQL数据库版本号。2、如何用客户端&#xff08;Navicat…

我是怎么进入Oracle这样的大企业的?

导语&#xff1a;人工智能是泡沫么&#xff1f;AI产业的未来将何去何从&#xff1f;机器学习又该怎么学习&#xff1f;AI行业从业者又是怎么看待这个行业的呢&#xff1f;踏入一个行业之前最好对这个行业有个全方位的了解。本文作者饶毅&#xff0c;现就职于甲骨文公司。AI行业…

websocket文档_WebSocket推送 原理扫盲到上手实践

关于服务端推送技术&#xff0c;大家比较熟悉的可能就是轮询&#xff0c;但是轮询只能是由客户端先发起http请求。在HTTP1.1中的keep-alive方式建立的http连接&#xff0c;但是一个Request只能对应一个Response&#xff0c;而且这个Response是被动的&#xff0c;不能主动发起。…

DISCUZ7.2在通达OA2009桌面显示技巧

最近在测试DISCUZ 和通达...猛然间看到,,,可以DISCUZ可以和通达完美结合,禁不住进行了测试.....效果还挺好的...最初效果图如下:感觉挺别扭的,于是将DISCUZ调用代码更改了代码如下:[show1] <table width"100%" > <tr> <td alignleft> <di…

如何在 ASP.Net Core 中使用 Lamar

ASP.Net Core 自带了一个极简的 开箱即用 的依赖注入容器&#xff0c;实际上&#xff0c;你还可以使用第三方的 依赖注入容器 来替代它&#xff0c;依赖注入是一种设计模式&#xff0c;它能够有效的实现对象之间的解耦并有利于提高单元测试和维护性&#xff0c;你可以使用 依赖…

扎克伯格做了26张PPT,员工效率提10倍,已被疯狂传阅!

1、时间常有&#xff0c;时间在于优先。2、时间总会有的&#xff1a;每天只计划 4&#xff5e;5 小时真正的工作。3、当你在状态时&#xff0c;就多干点&#xff1b;不然就好好休息&#xff1a;有时候会连着几天不是工作状态&#xff0c;有时在工作状态时却又能天天忙活 12 小时…

2010南非世界杯32强手绘海报

2010南非世界杯32强手绘海报 2010年南非世界杯已经进入最后的倒计时&#xff0c;近日&#xff0c;ESPN推出了一组以世界杯32强为主题的手绘海报。在这组颇有漫画性质的海报中&#xff0c;32强每支球队的特点都是展现得淋淋尽致&#xff0c;卡卡、梅西、C罗、托雷斯等球星也自然…

鹅厂二面,Nginx回忆录

上周二面鹅厂&#xff0c;面试官问出了“nginx你了解吗&#xff1f;”这样宽泛直白的句式&#xff0c;我一时抓不到重点&#xff0c;一时语噻。下班想了一下&#xff0c;平时潜移默化用到不少nginx的能力&#xff0c;但在面试的时候没有吹成对应的概念。面谈nginx核心能力nginx…

干货|吴恩达Coursera课程教你学习神经网络二!

上一周的课程中讲了神经网络的结构以及正向传播(feed forward)过程&#xff0c;了解了神经网络是如何进行预测的&#xff0c;但是预测的结果怎么和真是结果进行比较以及发现了错误如何修改还没有提及。这一周的课程中&#xff0c;介绍了cost function作为结果比较的标准以及bac…

vue预加载动态生成runtime.js_预渲染 prerender-spa-plugin 避坑指南

预渲染原理在webpack打包结束并生成文件后&#xff08;after-emit hook&#xff09;&#xff0c;会启动一个server模拟网站的运行&#xff0c;用puppeteer&#xff08;google官方的headless 无头浏览器浏览器&#xff09;访问指定的页面route&#xff0c;得到相应的html结构&am…

使用 .NET CLI 构建项目脚手架

前言在微服务场景中&#xff0c;开发人员分配到不同的小组&#xff0c;系统会拆分为很多个微服务&#xff0c;有一点是&#xff0c;每个项目都需要单元测试&#xff0c;接口文档&#xff0c;WebAPI接口等&#xff0c;创建新项目这些都是重复的工作&#xff0c;而且还要保证各个…

.net 垃圾回收机制

尽管在.NET framework下我们并不需要担心内存管理和垃圾回收(Garbage Collection)&#xff0c;但是我们还是应该了解它们&#xff0c;以优化我们的应用程序。同时&#xff0c;还需要具备一些基础的内存管理工作机制的知识&#xff0c;这样能够有助于解释我们日常程序编写中的变…