NET中解决KafKa多线程发送多主题的问题
一般在KafKa消费程序中消费可以设置多个主题,那在同一程序中需要向KafKa发送不同主题的消息,如异常需要发到异常主题,正常的发送到正常的主题,这时候就需要实例化多个主题,然后逐个发送。
在NET中用RdKafka组件来做消息处理,在Nuget中引用。
在程序中初始化Producer,并创建多个Topic
- private string comtopic = "topic1";
- private string errtopic = "topic2";
- private string kfkip = "192.168.80.32:9092";
- Topic topic = null;
- Topic errTopic = null;
- public ExcuteFlow()
- {
- try
- {
- Producer producer = new Producer(kfkip);
- topic = producer.Topic(comtopic);
- errTopic = producer.Topic(errtopic);
- }
- catch (RdKafkaException ex)
- {
- LogHelper.Error("KafKa初始化KafKa异常 ", ex);
- }
- catch (Exception ex)
- {
- LogHelper.Error("KafKa初始化异常", ex);
- }
- }
在程序中发送其中一个主题:
- try
- {
- if (topic != null)
- {
- byte[] datas = Encoding.UTF8.GetBytes(JsonHelper.ToJson(flowCommond));
- Task<DeliveryReport> deliveryReport = topic.Produce(datas);
- var unused = deliveryReport.ContinueWith(task =>
- {
- LogHelper.Info("内容:{flowCommond.ID} 发送到分区:{task.Result.Partition}, Offset 为: {task.Result.Offset}");
- });
- }
- else
- {
- throw new Exception("发送消息到KafKa topic 为空");
- }
- }
- catch (RdKafkaException ex)
- {
- LogHelper.Error("发送消息到KafKa KafKa异常", ex);
- }
- catch (Exception ex)
- {
- LogHelper.Error("发送消息到KafKa异常", ex);
- }
flowCommond为要发送的对象内容,格式化为Json字符串再发送。
另一个主题一样处理。
这里实现一个线程里面发送多个主题,那下面实现多个线程中如何发送多个主题。
多线程中如果每个线程都new Producer(kfkip) 一次,那KafKa的连接很快会被占满。
那这里就用单例模式来解决这个问题,每次要用到Producer时检查一下是否已经存在Producer实例,若存在则直接用不用再生成。
- /// <summary>
- /// 单例模式的实现
- /// </summary>
- public class SingleProduct : Producer
- {
- // 定义一个静态变量来保存类的实例
- private static SingleProduct uniqueInstance;
- // 定义一个标识确保线程同步
- private static readonly object locker = new object();
- // 定义私有构造函数,使外界不能创建该类实例
- private SingleProduct(string brokerList) : base(brokerList)
- {
- }
- /// <summary>
- /// 定义公有方法提供一个全局访问点,同时你也可以定义公有属性来提供全局访问点
- /// </summary>
- /// <returns></returns>
- public static SingleProduct GetInstance()
- {
- // 当第一个线程运行到这里时,此时会对locker对象 "加锁",
- // 当第二个线程运行该方法时,首先检测到locker对象为"加锁"状态,该线程就会挂起等待第一个线程解锁
- // lock语句运行完之后(即线程运行完之后)会对该对象"解锁"
- if (uniqueInstance == null)
- {
- lock (locker)
- {
- // 如果类的实例不存在则创建,否则直接返回
- if (uniqueInstance == null)
- {
- string kfkip = System.Configuration.ConfigurationManager.AppSettings["KfkIP"];
- try
- {
- uniqueInstance = new SingleProduct(kfkip);
- LogHelper.Error("单例模式 实例化 SingleProduct");
- }
- catch (RdKafkaException ex)
- {
- LogHelper.Error("单例模式 KafKa初始化KafKa异常 ", ex);
- }
- catch (Exception ex)
- {
- LogHelper.Error("单例模式 KafKa初始化异常", ex);
- }
- }
- }
- }
- return uniqueInstance;
- }
- }
然后在初始化的代码中替换Producer producer = new Producer(kfkip);为 Producer producer = SingleProduct.GetInstance();
OK!以上就完成了多线程多主题的消息发送。
NET中解决KafKa多线程发送多主题的问题的更多相关文章
- NET中解决KafKa多线程发送多主题
NET中解决KafKa多线程发送多主题 一般在KafKa消费程序中消费可以设置多个主题,那在同一程序中需要向KafKa发送不同主题的消息,如异常需要发到异常主题,正常的发送到正常的主题,这时候就需要实 ...
- 【Azure Developer】在Azure VM (Windows) 中搭建 kafka服务,并且通过本地以及远程验证 发送+消费 消息
问题描述 查看了 "How to Install and Run Apache Kafka on Windows? " 一文后,成功安装了Kafka服务,但是如何使用呢?如何在其他 ...
- Java中解决多线程数据安全问题
同步代码块 基本语句 synchronized (任意对象) { 操作共享代码 } 代码示例 public class SellTicket implements Runnable { private ...
- springboot+kafka+邮件发送(最佳实践)
导读 集成spring-kafka,生产者生产邮件message,消费者负责发送 引入线程池,多线程发送消息 多邮件服务器配置 定时任务生产消息:计划邮件发送 实现过程 导入依赖 <proper ...
- 在Asp.Net Core中集成Kafka(中)
在上一篇中我们主要介绍如何在Asp.Net Core中同步Kafka消息,通过上一篇的操作我们发现上面一篇中介绍的只能够进行简单的首发kafka消息并不能够消息重发.重复消费.乐观锁冲突等问题,这些问 ...
- 深入解析PHP中的(伪)多线程与多进程
本篇文章是对PHP中的(伪)多线程与多进程进行了详细的分析介绍,需要的朋友参考下 (伪)多线程:借助外力利用WEB服务器本身的多线程来处理,从WEB服务器多次调用我们需要实现多线程的程序.QUOTE: ...
- 如何在优雅地Spring 中实现消息的发送和消费
本文将对rocktmq-spring-boot的设计实现做一个简单的介绍,读者可以通过本文了解将RocketMQ Client端集成为spring-boot-starter框架的开发细节,然后通过一个 ...
- kafka 多线程消费
一. 1.Kafka的消费并行度依赖Topic配置的分区数,如分区数为10,那么最多10台机器来并行消费(每台机器只能开启一个线程),或者一台机器消费(10个线程并行消费).即消费并行度和分区数一致. ...
- 项目中引入kafka
项目如果需要引入kafka,可以从以下几个流程走: 1.pom文件引对应的jar包 <dependency> <groupId>org.apache.kafka</gro ...
随机推荐
- Kafka官方文档翻译——实现
IMPLEMENTATION 1. API Design Producer APIs Producer API封装了底层两个Producer: kafka.producer.SyncProducer ...
- [Unity] A* pathfinding project integrated with influence map
简介 最近一阶段重温了一些关于游戏人工智能方面的书籍. 加强了对influence map的认知.想要亲自动手实现一下. 正如文章标题所示,这篇文章讲的是:如何将influence map的机制融入到 ...
- 国内互联网公司github网址
-----------------------------------------------------推荐技术------------------------------------------- ...
- Spring配置注解详解
- hadoop伪分布式环境搭建
环境:Centos6.9+jdk+hadoop1.下载hadoop的tar包,这里以hadoop2.6.5版本为例,下载地址https://archive.apache.org/dist/hadoop ...
- 【知识整理】这可能是最好的RxJava 2.x 入门教程(五)
这可能是最好的RxJava 2.x入门教程系列专栏 文章链接: 这可能是最好的RxJava 2.x 入门教程(一) 这可能是最好的RxJava 2.x 入门教程(二) 这可能是最好的RxJava 2. ...
- docker中执行sed: can't move '/etc/resolv.conf73UqmG' to '/etc/resolv.conf': Device or resource busy错误的处理原因及方式
错误现象 在docker容器中想要修改/etc/resolv.conf中的namesever,使用sed命令进行执行时遇到错误: / # sed -i 's/192.168.1.1/192.168.1 ...
- 在ASP.NET CORE 2.0使用SignalR技术
一.前言 上次讲SignalR还是在<在ASP.NET Core下使用SignalR技术>文章中提到,ASP.NET Core 1.x.x 版本发布中并没有包含SignalR技术和开发计划 ...
- require.js(浅聊)
一.require 了解requirejs之前首先明白什么是模块化: 1.什么是模块化? 模块化设计是指在对一定范围内的不同功能或相同功能不同性能.不同规格的产品进行功能分析的基础上,划分并设计出一系 ...
- English - Mosquitos
Smith's house is full of mosquitos. Every night they bite him. He can not sleep because the mosquito ...