请教下这种情况下有必要上消息队列吗
公司现在做物联网智能宇,起步不久,现在的架构是一个项目负责采集设备信息,放到 redis 里,另外一个项目负责从 redis 里读取采集到信息,抽到自己的 mysql 数据库并持久化展示,采集跟抽取都是用定时任务来完成,像能耗系统,温湿度,一些系统频率不高好像没啥问题,但是防盗报警,消防报警这种,如果用 quartz,如果想保证实时性必须把定时任务设置的很频繁才行,会不会对系统压力比较大,查网上资料说消息队列的好处是异步削峰解耦,好像在此场景下都不是强需求
公司现在做物联网智能宇,起步不久,现在的架构是一个项目负责采集设备信息,放到 redis 里,另外一个项目负责从 redis 里读取采集到信息,抽到自己的 mysql 数据库并持久化展示,采集跟抽取都是用定时任务来完成,像能耗系统,温湿度,一些系统频率不高好像没啥问题,但是防盗报警,消防报警这种,如果用 quartz,如果想保证实时性必须把定时任务设置的很频繁才行,会不会对系统压力比较大,查网上资料说消息队列的好处是异步削峰解耦,好像在此场景下都不是强需求
@hantsy 抱歉都看不懂你说的 domain 和 MS 演进是什么
@opengps 小项目,但是公司愿景很大,一口气上了二十几个模块,什么消防温湿度考勤停车场广播一卡通,很多都只是 demo,我称之为面向 ppt 编程,至于为啥分两个项目,是因为沿用以前二开的一个.net 项目,现在报警表里还有奇怪的字段压根没用到
@keepeye 考虑过这个方案,项目负责人说目前没有必要,我自己写写试试
从这个角度来说,智能设备与服务器的数据交互模式应该是,服务端把新增或修改的配置信息发给智能设备,智能设备根据配置信息里的数据采集规则,主动向服务端推送。这样做的好处是:
(1).如果智能设备负载过高,它可以通过降低数据推送频率来保持稳定。不然如果是服务端主动采集的话,智能设备可能会因本来就负载过高,还得响应来自服务端的请求,很容易挂掉。另外,如果智能设备功耗过高,或剩余电量不足,它也可以自行调节数据推送的频率,来达到降低功耗,或增加续航时间的目的。
(2).由于智能设备,把数据推往服务器的时间,通常设定为整点时间,比如 14 点 10 分 00 秒,那么服务端在处理接收数据的负载问题上,很容易出现差异很大的峰值现象。也就是说,对于服务端来说,要不在某一刻会同时接收到几乎大部分设备的推送数据,要不在某一时刻干脆就彻底闲着,因为没啥设备推送数据。比如:14 点 10 分 00 秒,1000 台智能设备同时推送数据,导致服务器负载 95%;然后 14 点 10 分 0 秒 – 14 点 19 分 59 秒,整台服务器负载却只有 1%;到了 14 点 20 分 0 秒,智能设备又同时推送,服务器负载飙升。
这问题的本质,同于春运,解决方法只有 2 种:
如果需要保证数据质量,就只能提供消化峰值的足够算力。这需要砸钱配置尽可能多、尽可能强的服务器或服务器集群;
要不,就降低数据推送频率,以及错峰推送,来降低项目预算。错峰推送的意思是,比如:
14 点 10 分 00 秒,ID 为 1-10 的 10 台设备进行数据推送。
5 秒后,
14 点 10 分 05 秒,ID 为 11-20 的 10 台设备进行数据推送。
5 秒后,
…..
感谢其他大佬们的建议,不一一回复了