消息队列 Kafka 的基本知识及 .NET Core 客户端
前言
最新项目中要用到消息队列来做消息的传输,之所以选着 Kafka 是因为要配合其他 java 项目中,所以就对 Kafka 了解了一下,也算是做个笔记吧。
本篇不谈论 Kafka 和其他的一些消息队列的区别,包括性能及其使用方式。
简介
Kafka 是一个实现了分布式的、具有分区、以及复制的日志的一个服务。它通过一套独特的设计提供了消息系统中间件的功能。它是一种发布订阅功能的消息系统。
一些名词
如果要使用 Kafka ,那么在 Kafka 中有一些名词需要知道,文本不讨论这些名词是否在其他消息队列中具有相同的含义。所有名词均是针对于 Kafka。
Message
消息,就是要发送的内容,一般包装成一个消息对象。
Topic
通俗来讲的话,就是放置“消息”的地方,也就是说消息投递的一个容器。假如把消息看作是信封的话,那么 Topic 就是一个邮筒,如下图所示:
Partition && Log
Partition 分区,可以理解为一个逻辑上的分区,像是我们电脑的磁盘 C:, D:, E: 盘一样,
Kafka 为每个分区维护着一份日志Log文件。
每个分区是一个有序的,不可修改的,消息组成的队列。 当消息过来的时候,会被追加到日志文件中,这个追加是根据 commit 命令来执行的。
分区中的每一条消息都有一个编号,叫做 offset id,这个 id 在当前分区中是唯一的,并且是递增的。
日志,就是用来记录分区中接收到的消息,因为每一个 Topic 可以同时向一个或者多个分区投递消息,所以实际在存储日志的时候,每个分区会对应一个日志目录,其命名规则一般为 <topic_name>-<partition_id>
, 目录中就是一个分区的一份 commit log 日志文件。
Kafka 集群会保存一个时间段内所有被发布出来的信息,无论这个消息是否已经被消费过,这个时间段是可以配置的。比如日志保存时间段被设置为2天,那么2天以内发布的消息都是可以消费的;而之前的消息为了释放空间将会抛弃掉。Kafka的性能与数据量不相干,所以保存大量的消息数据不会造成性能问题。
对日志进行分区主要是为了以下几个目的:第一、这可以让log的伸缩能力超过单台服务器上线,每个独立的partition的大小受限于单台服务器的容积,但是一个topic可以有很多partition从而使得它有能力处理任意大小的数据。第二、在并行处理方面这可以作为一个独立的单元。
生产者 Producers
和其他消息队列一样,生产者通常都是消息的产生方。
在 Kafka 中它决定消息发送到指定Topic的哪个分区上。
消费者 Consumers
消费者就是消息的使用者,在消费者端也有几个名词需要区分一下。
一般消息队列有两种模式的消费方式,分别是 队列模式 和 订阅模式。
队列模式:一对一,就是一个消息只能被一个消费者消费,不能重复消费。一般情况队列支持存在多个消费者,但是对于一个消息,只会有一个消费者可以消费它。
订阅模式:一对多,一个消息可能被多次消费,消息生产者将消息发布到Topic中,只要是订阅改Topic的消费者都可以消费。
Consumer && Subscriber
Group: 组,是一个消费者的集合,每一组都有一个或者多个消费者,Kafka 中在一个组内,消息只能被消费一次。
在发布订阅模式中,消费者是以组的方式进行订阅的,就是Consumer Group,他们的关系如下图:
每个发布到Topic上的消息都会被投递到每个订阅了此Topic的消费者组中的某一个消费者,也就是每个组都会被投递,但是每个组都只会有一个消费者消费这个消息。
开头介绍了Kafka 是 发布-订阅 功能的消息队列,所以在Kafka中,队列模式是通过单个消费者组实现的,也就是整个结构中只有一个消费者组,消费者之间负载均衡。
Kafka 集群
Borker: Kafka 集群有多个服务器组成,每个服务器称做一个 Broker。同一个Topic的消息按照一定的key和算法被分区存储在不同的Broker上。
上图引用自:http://blog.csdn.net/lizhitao
因为 Kafka 的集群它是通过将分区散布到各个Server的实现的,也就是说集群中每个服务器他们都是彼此共享分区的数据和请求,每个分区的日志文件被复制成指定分数,分散在各个集群机器,这样来实现的故障转移。
对于每一个分区都会有一个服务器作为它的 "leader" 并且有零个或者多个服务器作为"followers" 。leader 服务器负责处理关于这个 partition 所有的读写请求, followers 服务器则被动的复制 leader 服务器。如果有 leader 服务器失效,那么 followers 服务器将有一台被自动选举成为新的 leader 。每个服务器作为某些 partition 的 leader 的同时也作为其它服务器的 follower ,从而实现了集群的负载均衡。
.NET Core Kafka 客户端
在 .NET Core 中,有相对应的开源 kafka sdk 项目,就是 Rdkafka。它同时支持 .NET 4.5,并且支持跨平台,可以运行于Linux,macOS 和 Windows。
RdKafka Github :https://github.com/ah-/rdkafka-dotnet
RdKafka Nuget :Install-Package RdKafka
生产者 API
// Producer 接受一个或多个 BrokerListusing (Producer producer = new Producer("127.0.0.1:9092"))//发送到一个名为 testtopic 的Topic,如果没有就会创建一个using (Topic topic = producer.Topic("testtopic")) { //将message转为一个 byte[]byte[] data = Encoding.UTF8.GetBytes("Hello RdKafka");DeliveryReport deliveryReport = await topic.Produce(data);Console.WriteLine($"发送到分区:{deliveryReport.Partition}, Offset 为: {deliveryReport.Offset}");
}
消费者 API
由于 Kafka 是以消费者组的形式进行消费的,所以需要指定一个GroupId。
在内部实现上,消费者是通过一个轮询机制来实现的对 Topic 消息的监控,这也是Kafka推荐的方式,在 Rdkafka 中轮询的间隔为 1 秒钟。
//配置消费者组var config = new Config() { GroupId = "example-csharp-consumer" }; using (var consumer = new EventConsumer(config, "127.0.0.1:9092")) { //注册一个事件consumer.OnMessage += (obj, msg) =>{ string text = Encoding.UTF8.GetString(msg.Payload, 0, msg.Payload.Length);Console.WriteLine($"Topic: {msg.Topic} Partition: {msg.Partition} Offset: {msg.Offset} {text}");}; //订阅一个或者多个Topicconsumer.Subscribe(new[] { "testtopic" }); //启动consumer.Start();Console.WriteLine("Started consumer, press enter to stop consuming");Console.ReadLine();
}
原文地址:http://www.cnblogs.com/savorboard/p/dotnetcore-kafka.html
.NET社区新闻,深度好文,微信中搜索dotNET跨平台或扫描二维码关注
消息队列 Kafka 的基本知识及 .NET Core 客户端相关推荐
- 光速入门消息队列Kafka
文章目录 光速入门消息队列Kafka 消息队列 知识要点 2.1 背景.问题的产生 2.2 消息队列应运而生 2.3 消息队列的特点 认识kafka 知识要点 2.1 认识kafka 2.2 kafk ...
- 分布式消息队列 Kafka
分布式消息队列 Kafka 2016-02-25 杜亦舒 Kafka是一个高吞吐量的.分布式的消息系统,由Linkedin开发,开发语言为scala 具有高吞吐.可扩展.分布式等特点 适用场景 活动数 ...
- 阿里云消息队列Kafka商业化:支持消息无缝迁移到云上
摘要: 7月25日,阿里云宣布正式推出消息队列Kafka,全面融合开源生态.在兼容Apache生态的基础上,阿里云消息队列Kafka彻底解决了开源产品稳定性不足的痛点,可用性达99.9%,数据可靠性9 ...
- 阿里云正式推出消息队列Kafka:全面融合开源生态
摘要: 在全面兼容Apache Kafka生态的基础上,消息队列Kafka彻底解决Apache Kafka稳定性不足的长期痛点,并且支持消息无缝迁移到云上. 近日,阿里云宣布正式推出消息队列Kafka ...
- 消息队列 Kafka的架构原理 (小白必看)
最终大家会掌握 Kafka 中最重要的概念,分别是 Broker.Producer.Consumer.Consumer Group.Topic.Partition.Replica.Leader.Fol ...
- 一文搞定大数据消息队列Kafka
文章目录 1.JMS+AMQP核心知识 1.1.什么是MQ中间件 1.2.使用场景 1.3.JMS消息服务和和常见核心概念 2.分布式流处平台Kafka核心概念 2.1.Kafka核心概念 2.2.特 ...
- 【中间件】大数据之分布式消息队列Kafka
目录 Kafka设计动机 Kafka特点 Kafka设计架构 基本架构 Kafka各组件详解 Kafka关键技术点 典型应用场景 在大数据数据收集环节,需要构建数据流水线,其中一种方式可以 ...
- 基于Docker搭建分布式消息队列Kafka
本文基于Docker搭建一套单节点的Kafka消息队列,Kafka依赖Zookeeper为其管理集群信息,虽然本例不涉及集群,但是该有的组件都还是会有,典型的kafka分布式架构如下图所示.本例搭建的 ...
- kafka创建topic_ELK-基础系列(六)-ELK加入消息队列-Kafka部署
Kafka集群部署指南 一.前言 1.Kafka简介 Kafka是一个开源的分布式消息引擎/消息中间件,同时Kafka也是一个流处理平台.Kakfa支持以发布/订阅的方式在应用间传递消息,同时并基于消 ...
最新文章
- sql server 经典SQL——分组统计
- Redis源码研究—基础知识
- python3精要(19)-全局变量global和工厂函数,lambda,变量作用范围,nonlocal
- Newtonsoft.Json反序列化(Deserialize)出错:Bad JSON escape sequence
- Mongodb -(3) replica set+sharding
- Linux 挂载windows网络共享文件 /etc/fstab功能详解
- 请求报文的方法及get与post的区别
- 云图说|不要小看不起眼的日志,“小日志,大作用”
- 移动端的注册登录设计灵感!
- 渐变海报背景素材|潮流2021还将延续
- mysql和sql时间 字段比较大小的问题
- 常见微型计算机外部输入设备,微型计算机常用外部设备
- js原生css修改,原生js获取、添加、修改_非行间css样式
- 云计算 第四章 微软云计算 Windows Azure
- vue时间天气插件_vue创建天气webapp
- Zotero修改英文文献的“等”为“et al”
- 图像的表示方法和种类
- mooc幕课零基础学Java语言(翁恺)if-else语句比较三个数, 输出最大值
- linux 基准测试,linux 性能测试之基准测试用具
- 基于SSM开发超市会员管理系统
热门文章
- T-SQL利用Row_Number函数实现分页
- java例程练习(一维数组)
- php与java安全之争
- 使用Dynamic LINQ创建高级查询服务
- Asp.NET Core 如何使用ElasticSearch和Kibana创建仪表板
- 使用C#为.NET Interactive开发自定义扩展
- Blazor+Dapr+K8s微服务之服务调用
- 腾讯35k招.NET Core开发,深扒这些技术要求 真的很难吗?
- 使用 Xunit.DependencyInjection 改造测试项目
- 日计不足涓滴成河-自定义响应结果格式化器