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包,我的生产者源码如下所示

             string brokerList = "118.24.184.36:9092";
string topicName = "test"; using (Producer producer = new Producer("118.24.184.36:9092"))
using (Topic topic = producer.Topic(topicName))
{
Console.WriteLine("{" + producer.Name + "} producing on {" + topic.Name + "}. q to exit."); string text;
while ((text = Console.ReadLine()) != "q")
{
byte[] data = Encoding.UTF8.GetBytes(text);
Task<DeliveryReport> deliveryReport = topic.Produce(data);
var unused = deliveryReport.ContinueWith(task =>
{
Console.WriteLine("Partition: {" + task.Result.Partition + "}, Offset: {" + task.Result.Offset + "}");
});
}
}

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

  

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

  

  .net 消费者

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

 static void Main(string[] args)
{
string brokerList = "118.24.184.36:9092";
List<string> topic = new List<string>();
topic.Add("test");
Run(brokerList, topic);
}
public static void Run(string brokerList, List<string> topics)
{
bool enableAutoCommit = false; var config = new Config()
{
GroupId = "advanced-csharp-consumer",
EnableAutoCommit = enableAutoCommit,
StatisticsInterval = TimeSpan.FromSeconds()
}; using (var consumer = new EventConsumer(config, brokerList))
{
consumer.OnMessage += (obj, msg) =>
{
string text = Encoding.UTF8.GetString(msg.Payload, , msg.Payload.Length);
Console.WriteLine($"Topic: {msg.Topic} Partition: {msg.Partition} Offset: {msg.Offset} {text}");
Console.WriteLine("1 Response: Partition {0},Offset {1} : {2}",
msg.Partition, msg.Offset, text);
if (!enableAutoCommit && msg.Offset % == )
{
Console.WriteLine("Committing offset");
consumer.Commit(msg).Wait();
Console.WriteLine("Committed offset");
}
}; consumer.OnConsumerError += (obj, errorCode) =>
{
Console.WriteLine($"Consumer Error: {errorCode}");
}; consumer.OnEndReached += (obj, end) =>
{
Console.WriteLine($"Reached end of topic {end.Topic} partition {end.Partition}, next message will be at offset {end.Offset}");
}; consumer.OnError += (obj, error) =>
{
Console.WriteLine($"Error: {error.ErrorCode} {error.Reason}");
}; if (enableAutoCommit)
{
consumer.OnOffsetCommit += (obj, commit) =>
{
if (commit.Error != ErrorCode.NO_ERROR)
{
Console.WriteLine($"Failed to commit offsets: {commit.Error}");
}
Console.WriteLine($"Successfully committed offsets: [{string.Join(", ", commit.Offsets)}]");
};
} consumer.OnPartitionsAssigned += (obj, partitions) =>
{
Console.WriteLine($"Assigned partitions: [{string.Join(", ", partitions)}], member id: {consumer.MemberId}");
consumer.Assign(partitions);
}; consumer.OnPartitionsRevoked += (obj, partitions) =>
{
Console.WriteLine($"Revoked partitions: [{string.Join(", ", partitions)}]");
consumer.Unassign();
}; consumer.OnStatistics += (obj, json) =>
{
Console.WriteLine($"Statistics: {json}");
}; consumer.Subscribe(topics);
consumer.Start(); Console.WriteLine($"Assigned to: [{string.Join(", ", consumer.Assignment)}]");
Console.WriteLine($"Subscribed to: [{string.Join(", ", consumer.Subscription)}]"); Console.WriteLine($"Started consumer, press enter to stop consuming");
Console.ReadLine();
}
}

  运行后得到如下效果,以下四个框分别是.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. Django框架中auth模块的详解

    auth模块 auth模块是对登录认证方法的一种封装,本身就是一个对象,可以获取用户的详细信息,有了auth模块可以验证登录信息是否存在数据库中,还可以检验用户是否已经登录,校验密码等 auth方法 ...

  2. 随笔js

    js中的函数定义之后,函数名就是这个函数(JS中函数其实也是对象)的地址(句柄) js读取函数内存地址: 首先想读内存地址只有C或者C++,汇编抛开不谈,其他高级语言一般都封装起来了,不过我也不能确定 ...

  3. 为什么html表单用post提交后,提交页面是空白

    为什么html表单用post提交后,提交页面是空白? 因为post提交就应该用doPost()方法处理数据

  4. eclipse快速创建一个Spring Boot应用

    1,创建一个空的maven项目 2,添加parent <parent> <groupId>org.springframework.boot</groupId> &l ...

  5. Map.Entry 类使用简介(转)

    Map.Entry 类使用简介(转)   你是否已经对每次从Map中取得关键字然后再取得相应的值感觉厌倦?使用Map.Entry类,你可以得到在同一时间得到所有的信息.标准的Map访问方法如下: Se ...

  6. 8.10-DayT3游走(wander)

    题目大意 lue.. 题解 先跑一遍tarjan缩点,在新图中加入两个强连通分量之间的边,则此图为一个有向无环图(DAG).则最终答案为1点所在的强连通分量或包括1点的几个强连通分量的点数之和. 如果 ...

  7. Ubuntu16.04 QT5编译出现cannot find -lGL和collect2:error:ld r

    在ubuntu下使用Qt 编译时候遇上了cannot find -lGL错误,使用命令 是由于系统缺少链接库,在终端执行下面命令就可以解决问题. sudo apt-get install libqt4 ...

  8. linx下跑多个tomcat

    1.修改server.xml文件 <Server port="8005" shutdown="SHUTDOWN"> <Connector po ...

  9. drf框架,restful接口规范,源码分析

    复习 """ 1.vue如果控制html 在html中设置挂载点.导入vue.js环境.创建Vue对象与挂载点绑定 2.vue是渐进式js框架 3.vue指令 {{ }} ...

  10. nginx的负载均衡配置

    1.下载nginx的压缩包,可以去官网下载 2.解压缩,可以看到其中有个conf的文件夹,在该目录中,nginx.conf配置文件就是核心配置文件 3.默认配置 #user nobody; worke ...