前言

最新项目中要用到消息队列来做消息的传输,之所以选着 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 客户端相关推荐

  1. 光速入门消息队列Kafka

    文章目录 光速入门消息队列Kafka 消息队列 知识要点 2.1 背景.问题的产生 2.2 消息队列应运而生 2.3 消息队列的特点 认识kafka 知识要点 2.1 认识kafka 2.2 kafk ...

  2. 分布式消息队列 Kafka

    分布式消息队列 Kafka 2016-02-25 杜亦舒 Kafka是一个高吞吐量的.分布式的消息系统,由Linkedin开发,开发语言为scala 具有高吞吐.可扩展.分布式等特点 适用场景 活动数 ...

  3. 阿里云消息队列Kafka商业化:支持消息无缝迁移到云上

    摘要: 7月25日,阿里云宣布正式推出消息队列Kafka,全面融合开源生态.在兼容Apache生态的基础上,阿里云消息队列Kafka彻底解决了开源产品稳定性不足的痛点,可用性达99.9%,数据可靠性9 ...

  4. 阿里云正式推出消息队列Kafka:全面融合开源生态

    摘要: 在全面兼容Apache Kafka生态的基础上,消息队列Kafka彻底解决Apache Kafka稳定性不足的长期痛点,并且支持消息无缝迁移到云上. 近日,阿里云宣布正式推出消息队列Kafka ...

  5. 消息队列 Kafka的架构原理 (小白必看)

    最终大家会掌握 Kafka 中最重要的概念,分别是 Broker.Producer.Consumer.Consumer Group.Topic.Partition.Replica.Leader.Fol ...

  6. 一文搞定大数据消息队列Kafka

    文章目录 1.JMS+AMQP核心知识 1.1.什么是MQ中间件 1.2.使用场景 1.3.JMS消息服务和和常见核心概念 2.分布式流处平台Kafka核心概念 2.1.Kafka核心概念 2.2.特 ...

  7. 【中间件】大数据之分布式消息队列Kafka

    目录 Kafka设计动机 Kafka特点 Kafka设计架构 基本架构 Kafka各组件详解 Kafka关键技术点 典型应用场景       在大数据数据收集环节,需要构建数据流水线,其中一种方式可以 ...

  8. 基于Docker搭建分布式消息队列Kafka

    本文基于Docker搭建一套单节点的Kafka消息队列,Kafka依赖Zookeeper为其管理集群信息,虽然本例不涉及集群,但是该有的组件都还是会有,典型的kafka分布式架构如下图所示.本例搭建的 ...

  9. kafka创建topic_ELK-基础系列(六)-ELK加入消息队列-Kafka部署

    Kafka集群部署指南 一.前言 1.Kafka简介 Kafka是一个开源的分布式消息引擎/消息中间件,同时Kafka也是一个流处理平台.Kakfa支持以发布/订阅的方式在应用间传递消息,同时并基于消 ...

最新文章

  1. sql server 经典SQL——分组统计
  2. Redis源码研究—基础知识
  3. python3精要(19)-全局变量global和工厂函数,lambda,变量作用范围,nonlocal
  4. Newtonsoft.Json反序列化(Deserialize)出错:Bad JSON escape sequence
  5. Mongodb -(3) replica set+sharding
  6. Linux 挂载windows网络共享文件 /etc/fstab功能详解
  7. 请求报文的方法及get与post的区别
  8. 云图说|不要小看不起眼的日志,“小日志,大作用”
  9. 移动端的注册登录设计灵感!
  10. 渐变海报背景素材|潮流2021还将延续
  11. mysql和sql时间 字段比较大小的问题
  12. 常见微型计算机外部输入设备,微型计算机常用外部设备
  13. js原生css修改,原生js获取、添加、修改_非行间css样式
  14. 云计算 第四章 微软云计算 Windows Azure
  15. vue时间天气插件_vue创建天气webapp
  16. Zotero修改英文文献的“等”为“et al”
  17. 图像的表示方法和种类
  18. mooc幕课零基础学Java语言(翁恺)if-else语句比较三个数, 输出最大值
  19. linux 基准测试,linux 性能测试之基准测试用具
  20. 基于SSM开发超市会员管理系统

热门文章

  1. T-SQL利用Row_Number函数实现分页
  2. java例程练习(一维数组)
  3. php与java安全之争
  4. 使用Dynamic LINQ创建高级查询服务
  5. Asp.NET Core 如何使用ElasticSearch和Kibana创建仪表板
  6. 使用C#为.NET Interactive开发自定义扩展
  7. Blazor+Dapr+K8s微服务之服务调用
  8. 腾讯35k招.NET Core开发,深扒这些技术要求 真的很难吗?
  9. 使用 Xunit.DependencyInjection 改造测试项目
  10. 日计不足涓滴成河-自定义响应结果格式化器