C# 如何给kafka消息配置优先级按序消费

本文介绍了如何在C#中为Kafka消息设置消费顺序,通过创建不同优先级的主题(高、中、低),并利用AutoResetEvent进行线程同步,确保消息按照高》中》低的顺序消费。通过定义不同优先级的消费线程,并控制其启动顺序,实现了分布式环境下的消息优先级消费。

        顾名思义kafka消息主题是没有优先级的配置,没办法配置消费顺序的,所有我们需要想办法给kafka消息配置消费顺序,如何做呢?

下面我给大家举个简单优先级事例,比如高中低三个顺序消费消息

        首先要定义三个消息主题,分别是高、中、低是哪个主题,英文分别是high、medium、low

这个时候他们还是没有先后消费的本领,下面需要我们赋予他们这个顺序级别思路如下

消费顺序,高》中》低,高和中都是可以插队来进行消费的,下面分析C#代码

先建立三个线程

        AutoResetEvent low = new AutoResetEvent(false);   //低的关卡

        AutoResetEvent medium= new AutoResetEvent(false); //中的关卡

        AutoResetEvent high= new AutoResetEvent(false); //高的关卡

        Dictionary<string,AutoResetEvent> list= new Dictionary<string,AutoResetEvent>();

        list.Add("low",low);

        list.Add("medium",medium);

        list.Add("high",high);

//定义消费低主题线程

Thread lowThread = new Thread(new ParameterizedThreadStart(new LowServer().Work));

lowThread.Stat(list);

//定义消费中主题线程

Thread mediumThread = new Thread(new ParameterizedThreadStart(new MediumServer().Work));

lowThread.Stat(list);

//定义消费高主题线程

Thread highThread = new Thread(new ParameterizedThreadStart(new HighServer().Work));

lowThread.Stat(list);

三个消费任务

class LowServer{
 
    public void Work(object list){
        Dictionary<string,AutoResetEvent> locks = list as Dictionary<string,AutoResetEvent>;
        AutoResetEvent medium = locks["medium"];
        AutoResetEvent high= locks["high"];
        var consumer = new ConsumerBuilder<string,object>("kafka配置")
                       .SetValueDeserializer(new 序列化类())
                       .Build();
        consumer.Subscribe("low");//订阅主题low 优先级:低
        while(true){
              if(highSign){//全局变量高主题是否有消息
                  //是
                 high.WaitOne();//等待高主题消息消费完
              } 
              if(mediumSign){//全局变量中主题是否有消息
                  //是
                 medium.WaitOne();//等待中主题消息消费完
              } //最后才轮到自己低主题的
            //然后获取消息工作就是了
    
        }

    }

}
class MediumServer{
 
    public void Work(object list){
        Dictionary<string,AutoResetEvent> locks = list as Dictionary<string,AutoResetEvent>;
        AutoResetEvent medium = locks["medium"];
        AutoResetEvent high= locks["high"];
        var consumer = new ConsumerBuilder<string,object>("kafka配置")
                       .SetValueDeserializer(new 序列化类())
                       .Build();
        consumer.Subscribe("medium");//订阅主题low 优先级:低
        while(true){
              if(highSign){//全局变量高主题是否有消息
                  //是
                 high.WaitOne();//等待高主题消息消费完
              } 
             //高主题消费完然后才轮到自己中主题的消费

            //然后获取消息工作就是了
            ConsumerResult<string,object> tempMsg=consumer.Consume();//拉取消息
             if(tempMsg.IsPartitionEOF){//是否消息消费完成
                //是,然后告诉低主题,我做完了,你做吧
                mediumSign=false;
                medium.Set();
             }
            //工作
        }

    }

}
class HighServer{
 
    public void Work(object list){
        Dictionary<string,AutoResetEvent> locks = list as Dictionary<string,AutoResetEvent>;
        AutoResetEvent high= locks["high"];
        var consumer = new ConsumerBuilder<string,object>("kafka配置")
                       .SetValueDeserializer(new 序列化类())
                       .Build();
        consumer.Subscribe("high");//订阅主题low 优先级:低
        while(true){
             //不需要等到我就是第一
            //然后获取消息工作就是了
            ConsumerResult<string,object> tempMsg=consumer.Consume();//拉取消息
             if(tempMsg.IsPartitionEOF){//是否消息消费完成
                //是,然后告诉中低主题,我做完了,你做吧
                highSign=false;
                high.Set();
             }
            //工作
        }

    }

}

最后就完成了,消息没有先后,但是线程执行有先后,如此思路,即可解决,支持分布式

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值