基于Redis消息的订阅发布应用场景

 🔥 交流讨论:欢迎加入我们一起学习!

🔥 资源分享耗时200+小时精选的「软件测试」资料包

🔥 教程推荐:火遍全网的《软件测试》教程  

📢欢迎点赞 👍 收藏 ⭐留言 📝 如有错误敬请指正!

1.应用背景

在物联网采集管控系统中,前后端隔离的情况下,前端通过表单(比如按钮,开关,表格等)输入数据到数据库(比如MySql,通过WEBAPI服务端输入),然后采集控制端到数据库里去扫表取数据,将数据下发给物联网络中的终端设备(比如风扇控制板),从而来控制风扇的开跟关。

2.困境

采集控制端需要到数据库中去扫表。这个扫表操作会带来几个问题:

2.1 锁表风险

扫表会有锁表风险,当该DBContext被占用的时候,其他线程不能实时使用此DBContext。

2.2 实时性差

在物联网系统中,数据会非常多,比如有10000台设备,每台设备有100个采集控制点,则控制点最多可能会达到100W数据,这样去扫表,不仅占用DBContext上下文的时间会很长,而且实时性会很差。

2.3 增加编程复杂性

增加了采集服务端编程的复杂性。

2.4 实时效果

用户体验效果较差:客户点了开关控制风扇打开,然后底端设备需要很长时间才能真正打开。

3.解决方案

使用消息订阅发布方法。RabbitMQ比较重,故这里选用Redis的订阅发布功能,而且很多情况下Redis已经被作为缓存在引用,详见如下。

3.1 前端传值给服务端

前端将实时控制值以Restful API形式通过IP地址端口号+路由(比如:192.168.2.106:5000/ControlConfig)将此值传递给服务端。

3.2 服务端通过消息传给采集控制端

这里通过nuget获得CSRedisCore,来操作Redis的订阅发布功能。采集控制端订阅消息。服务端发布消息。这样操作达到了如下目的:2.1不用经过数据库消息的实时传递;2.2 实时性好;2.3 编程也简单;2.4 实时效果好。

4.详细代码设计

4.1 CSRedisCore

CSRedis 是 redis.io 官方推荐库,支持 redis-trib集群、哨兵、私有分区与连接池管理技术,简易 RedisHelper 静态类。
NuGet Gallery | CSRedisCore 3.8.803
通过Nuget获得CSRedisCore库

4.2 接口设计如下

详细说明参考注释。

 
  1. using CSRedis;

  2. namespace IBMS.Infrastruct.Redis

  3. {

  4. public interface IRedisMQ

  5. { //连接Redis

  6. CSRedisClient ConnectCSRedis();

  7. //订阅频道

  8. void SubscribeCSRedis(string ChannelName);

  9. //把message异步发布Redis的频道

  10. void PublishAsyncCSRedis(string channel, string message);

  11. //释放Redis

  12. void DisposeCSRedis();

  13. //订阅接受下来的msg的方法

  14. void Rcv(string Msg, string channel);

  15. }

  16. }

4.3 接口实现如下

详细说明见注释

 
  1. using System;

  2. using CSRedis;

  3. using IBMS.Infrastruct.Appsetting;

  4. namespace IBMS.Infrastruct.Redis

  5. {

  6. public class RedisMQ : IRedisMQ

  7. {

  8. //读取连接Redis字符串

  9. private readonly string connectRedis = Appsettings.app(new string[] { "AppSettings", "RedisCaching", "ConnectionString" });//按照层级的顺序,依次写出来

  10. //定义一个Redis客户端对象

  11. CSRedisClient _RedisMQ;

  12. //连接Redis

  13. public CSRedisClient ConnectCSRedis()

  14. {

  15. return _RedisMQ = new CSRedisClient(connectRedis);

  16. }

  17. //释放Redis

  18. public void DisposeCSRedis()

  19. {

  20. _RedisMQ.Dispose();

  21. }

  22. //异步发布消息到Redis的某个频道

  23. public void PublishAsyncCSRedis(string channelName, string message)

  24. {

  25. _RedisMQ.PublishAsync(channelName, message);

  26. }

  27. //如果自己需要用消息值,需要想方法返回数据

  28. //订阅消息的处理方法

  29. public void Rcv(string channel, string Msg)

  30. {

  31. Console.WriteLine($"{DateTime.Now.ToLongDateString()}|Rcv:{channel},Msg:{Msg}");

  32. }

  33. //订阅消息

  34. public void SubscribeCSRedis(string ChannelName)

  35. {

  36. _RedisMQ.Subscribe((ChannelName, msg => Rcv(msg.Channel, msg.Body)));

  37. }

  38. }

  39. }

4.4 ConfigureServices中依赖注入

在Startup.cs中的ConfigureServices方法进行依赖注入,如下。
services.AddScoped<IRedisMQ, RedisMQ>();

4.5 创建一个RedisMQ的消息对象

如果对Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化、分布式架构。感兴趣可以785128166,群内会有不定期的发放免费的资料链接,这些资料都是从各个技术网站搜集、整理出来的,如果你有好的学习资料可以私聊发我,我会注明出处之后分享给大家。

在Controller里定义创建一个消息对象,这一步的前提是需要依赖注入,依赖注入在某种意义上跟C语言的typedef有点像,将typedef会将控制权交给编译器,编译器定义新类型,然后程序运行之后就可以就可以随意通过新类型来定义对象。
IRedisMQ _RedisMQ =new RedisMQ();

4.6 实现层代码设计

 
  1. // PUT: api/ControlConfig/5

  2. [HttpPut]

  3. public async Task Update([FromBody] ControlConfig ControlConfig)

  4. {

  5. _RedisMQ.ConnectCSRedis();

  6. _RedisMQ.SubscribeCSRedis("web");

  7. _RedisMQ.PublishAsyncCSRedis("web", $"add at{DateTime.Now}");

  8. _RedisMQ.PublishAsyncCSRedis("web", $"{SerializeHelper.Serialize(ControlConfig)}");

  9. Console.ReadKey();

  10. _RedisMQ.DisposeCSRedis();

  11. }

5.效果

5.1 打开风扇按钮

5.2 RedisDesktopManager工具中观察

在RedisDesktopManager的命令行窗口中输入PSUBSCRIBE web,进行订阅web频道,如下

5.3 观察web频道输出信息

在前端控制了风扇打开操作之后如5.1,在RedisDesktopManager观察web频道输出信息

5.4 观察实际风扇效果

风扇实时打开。
备注:采集控制端跟设备端是基于TCP长连接组网方式,协议用的是基于MODBUS的变种,比如加入我们自己的包头包尾包类型等信息,这里不做展开

6 框架图

补上一张框架图,拖到浏览器新窗口,点击放大即可清晰浏览,采用亿图制作,以便更好理解。

最后我邀请你进入我们的【软件测试学习交流群:785128166】, 大家可以一起探讨交流软件测试,共同学习软件测试技术、面试等软件测试方方面面,还会有免费直播课,收获更多测试技巧,我们一起进阶Python自动化测试/测试开发,走向高薪之路

作为一个软件测试的过来人,我想尽自己最大的努力,帮助每一个伙伴都能顺利找到工作。所以我整理了下面这份资源,现在免费分享给大家,有需要的小伙伴可以关注【公众号:程序员二黑】自提!

  • 12
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值