Kafka安装

  首先我们需要在windows服务器上安装kafka以及zookeeper,有关zookeeper的介绍将会在后续进行讲解。

在网上可以找到相应的安装方式,我采用的是腾讯云服务器,借鉴的是https://www.cnblogs.com/lnice/p/9668750.html

根据上面博客安装完成后,我们在kafka中新建了一个名叫test的Topic,并新建了一个生产者和一个消费者。

  注:控制台生产者和控制台消费者的数据不同是因为我用.net开发了一个生产者所致,后面会讲

  

  .net生产者  

  当前市面上比较好的.NET的kafka开源包有两个:kafka-net和rdkafka,我采用的是RdKafka;

  新建项目后首先添加Nuget包,我的生产者源码如下所示

  1. string brokerList = "118.24.184.36:9092";
  2. string topicName = "test";
  3.  
  4. using (Producer producer = new Producer("118.24.184.36:9092"))
  5. using (Topic topic = producer.Topic(topicName))
  6. {
  7. Console.WriteLine("{" + producer.Name + "} producing on {" + topic.Name + "}. q to exit.");
  8.  
  9. string text;
  10. while ((text = Console.ReadLine()) != "q")
  11. {
  12. byte[] data = Encoding.UTF8.GetBytes(text);
  13. Task<DeliveryReport> deliveryReport = topic.Produce(data);
  14. var unused = deliveryReport.ContinueWith(task =>
  15. {
  16. Console.WriteLine("Partition: {" + task.Result.Partition + "}, Offset: {" + task.Result.Offset + "}");
  17. });
  18. }
  19. }

  如你所见,当我们在软件的输入框输入hellow world并回车后,控制台的消费者就收到了。

  

  如上图,控制台消费者收到了.net生产者发布的消息。

  

  .net 消费者

  我采用的还是RfKafka这个插件,采用的代码如下

  1. static void Main(string[] args)
  2. {
  3. string brokerList = "118.24.184.36:9092";
  4. List<string> topic = new List<string>();
  5. topic.Add("test");
  6. Run(brokerList, topic);
  7. }
  8. public static void Run(string brokerList, List<string> topics)
  9. {
  10. bool enableAutoCommit = false;
  11.  
  12. var config = new Config()
  13. {
  14. GroupId = "advanced-csharp-consumer",
  15. EnableAutoCommit = enableAutoCommit,
  16. StatisticsInterval = TimeSpan.FromSeconds()
  17. };
  18.  
  19. using (var consumer = new EventConsumer(config, brokerList))
  20. {
  21. consumer.OnMessage += (obj, msg) =>
  22. {
  23. string text = Encoding.UTF8.GetString(msg.Payload, , msg.Payload.Length);
  24. Console.WriteLine($"Topic: {msg.Topic} Partition: {msg.Partition} Offset: {msg.Offset} {text}");
  25. Console.WriteLine("1 Response: Partition {0},Offset {1} : {2}",
  26. msg.Partition, msg.Offset, text);
  27. if (!enableAutoCommit && msg.Offset % == )
  28. {
  29. Console.WriteLine("Committing offset");
  30. consumer.Commit(msg).Wait();
  31. Console.WriteLine("Committed offset");
  32. }
  33. };
  34.  
  35. consumer.OnConsumerError += (obj, errorCode) =>
  36. {
  37. Console.WriteLine($"Consumer Error: {errorCode}");
  38. };
  39.  
  40. consumer.OnEndReached += (obj, end) =>
  41. {
  42. Console.WriteLine($"Reached end of topic {end.Topic} partition {end.Partition}, next message will be at offset {end.Offset}");
  43. };
  44.  
  45. consumer.OnError += (obj, error) =>
  46. {
  47. Console.WriteLine($"Error: {error.ErrorCode} {error.Reason}");
  48. };
  49.  
  50. if (enableAutoCommit)
  51. {
  52. consumer.OnOffsetCommit += (obj, commit) =>
  53. {
  54. if (commit.Error != ErrorCode.NO_ERROR)
  55. {
  56. Console.WriteLine($"Failed to commit offsets: {commit.Error}");
  57. }
  58. Console.WriteLine($"Successfully committed offsets: [{string.Join(", ", commit.Offsets)}]");
  59. };
  60. }
  61.  
  62. consumer.OnPartitionsAssigned += (obj, partitions) =>
  63. {
  64. Console.WriteLine($"Assigned partitions: [{string.Join(", ", partitions)}], member id: {consumer.MemberId}");
  65. consumer.Assign(partitions);
  66. };
  67.  
  68. consumer.OnPartitionsRevoked += (obj, partitions) =>
  69. {
  70. Console.WriteLine($"Revoked partitions: [{string.Join(", ", partitions)}]");
  71. consumer.Unassign();
  72. };
  73.  
  74. consumer.OnStatistics += (obj, json) =>
  75. {
  76. Console.WriteLine($"Statistics: {json}");
  77. };
  78.  
  79. consumer.Subscribe(topics);
  80. consumer.Start();
  81.  
  82. Console.WriteLine($"Assigned to: [{string.Join(", ", consumer.Assignment)}]");
  83. Console.WriteLine($"Subscribed to: [{string.Join(", ", consumer.Subscription)}]");
  84.  
  85. Console.WriteLine($"Started consumer, press enter to stop consuming");
  86. Console.ReadLine();
  87. }
  88. }

  运行后得到如下效果,以下四个框分别是.net生产者,控制台生产者,.net消费者,控制台消费者。

  

  至此.net关于kafka的使用就讲完了。

这里有一篇文章分享给大家,把很多kafka的一些深入理解进行了很通俗的讲解:

http://melanx.com/2019/01/07/深入浅出理解基于-kafka-和-zookeeper-的分布式消息队列/#12kafkatopic

  如果你在使用上诉代码时遇到了如下问题:

解决方案如下:将工程切到.net4.0,再将工程切到.net4.5或你需要的版本

  不要问我为什么,我是这样解决的,否则就需要根据缺失的库进行相关插件安装。

Kafka .net 开发入门的更多相关文章

  1. Kafka Streams开发入门(1)

    背景 最近发现Confluent公司在官网上发布了Kafka Streams教程,共有10节课,每节课给出了Kafka Streams的一个功能介绍.这个系列教程对于我们了解Kafka Streams ...

  2. Kafka Streams开发入门(5)

    1. 背景 上一篇演示了split操作算子的用法.今天展示一下split的逆操作:merge.Merge算子的作用是把多股实时消息流合并到一个单一的流中. 2. 功能演示说明 假设我们有多个Kafka ...

  3. Kafka Streams开发入门(4)

    背景 上一篇演示了filter操作算子的用法.今天展示一下如何根据不同的条件谓词(Predicate)将一个消息流实时地进行分流,划分成多个新的消息流,即所谓的流split.有的时候我们想要对消息流中 ...

  4. Kafka Streams开发入门(3)

    背景 上一篇我们介绍了Kafka Streams中的消息过滤操作filter,今天我们展示一个对消息进行转换Key的操作,依然是结合一个具体的实例展开介绍.所谓转换Key是指对流处理中每条消息的Key ...

  5. Kafka Streams开发入门(2)

    背景 上一篇我们介绍了Kafka Streams中的消息转换操作map,今天我们给出另一个经典的转换操作filter的用法.依然是结合一个具体的实例展开介绍. 演示功能说明 本篇演示filter用法, ...

  6. openresty 前端开发入门五之Mysql篇

    openresty 前端开发入门五之Mysql篇 这章主要演示怎么通过lua连接mysql,并根据用户输入的name从mysql获取数据,并返回给用户 操作mysql主要用到了lua-resty-my ...

  7. java WEB开发入门

    WEB开发入门 1 进入web JAVASE:标准- standard   JAVA桌面程序 GUI    SOCKET JAVAEE:企业-浏览器控制  web 2 软件结构 C/S :client ...

  8. [译]:Xamarin.Android开发入门——Hello,Android Multiscreen深入理解

    原文链接:Hello, Android Multiscreen_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android Multiscreen深入理解. 本 ...

  9. [译]:Xamarin.Android开发入门——Hello,Android深入理解

    返回索引目录 原文链接:Hello, Android_DeepDive. 译文链接:Xamarin.Android开发入门--Hello,Android深入理解 本部分介绍利用Xamarin开发And ...

随机推荐

  1. dyt说反话(注意字符串输入)

    题目内容: dyt喜欢对lrh说的话说反话,现给出lrh说的k句话,输出dyt所说的反话. 输入格式 第一行是样例个数k(k<10) 接下来k行,每行包含lrh说的一句话(每句话长度不超过50, ...

  2. kali linux2019.4安装启动后中文乱码

    1.鼠标右键找到黑框框打开终端 2.终端执行后重启,乱码解决. sudo apt-get install ttf-wqy-zenhei

  3. Pycharm调试django项目时发现断点失效

    解决方法: 第一步: 第二步: 点击 Edit Configuration 第三步 : 点击 + 选择python 填写相关参数信息 或者 点击ok  完成配置  重启 IDE 注意   重启IDE ...

  4. 2019 ICPC 徐州网络赛 B.so easy (并查集)

    计蒜客链接:https://nanti.jisuanke.com/t/41384 题目大意:给定n个数,从1到n排列,其中有q次操作,操作(1) 删除一个数字 // 操作(2)求这个数字之后第一个没有 ...

  5. Docker 基本命令和使用

    Docker 基本命令 systemctl start docker : 启动 Docker systemctl stop docker : 停止 Docker systemctl restart d ...

  6. thinkphp的同步上传图片和异步上传图片

    同步: 前台页面: <div class="form-div"> <form action="{:url('index/i/edit_head_img_ ...

  7. AcWing 841. 字符串哈希

    //快速判断两次字符串是不是相等 #include<bits/stdc++.h> using namespace std ; typedef unsigned long long ULL; ...

  8. 生成树计数模板 spoj 104 (不用逆元的模板)

    /* 这种题,没理解,只是记一记如何做而已: 生成树的计数--Matrix-Tree定理 题目:SPOJ104(Highways) 题目大意: *一个有n座城市的组成国家,城市1至n编号,其中一些城市 ...

  9. linux日常运维工作

    Linux的使用环境也日趋成熟,各种开源产品络绎不绝,大有百花齐放的盛景,那么当Linux落地企业,回归工作时,我们还要面对这Linux运维方面的诸多问题,今天我们特意组织一场有关Linux 在企业运 ...

  10. java判断两个时间相差得天数

    方法一:通过Calendar类得日期比较,在这需要考虑闰年和平年,也要考虑跨年份 /** * date2比date1多的天数 * @param date1 * @param date2 * @retu ...