智慧停车(六) 怎么最优实现免费停车时间方案

2019-07-16 09:30:06

业务场景如下:车位挡板默认为下降状态,车子初次入场的时候,数据库记录入场时间,这个时间就是免费时间的开始,各个城市各个路段的免费时间策略也不一样,比如在某个地段设置免费时间为10分钟,后台计算当到了10分钟后,会发送指令让挡板上升,这个时间就是收费时间的开始。

后台怎么来监控每个车位的免费时间是否到点,有如下方案:

方案1:定时调度轮询数据库

数据库表会记录开始时间,隔一段时间就轮询一次,计算当前时间和开始时间的差,来确定是否免费时间到点,这种方式数据量小,对时间精准度底的情况下可以使用,针对数据量大的情况,拆分多个定时调度各轮询自己的一部分,甚至可以将数据库数据放入到redis里面加快轮询速度,也只能这样了,考虑到实现和维护以及效率差,有时间差,暂不考虑。

方案2:使用spring + quartz定时任务

使用spring + quartz定时任务(支持任务信息写入mysql,多节点分布式执行任务),每次车主入场开始生成一个某某时间后运行的任务。查阅了相关文档也尝试使用了一把,中途放弃了,受不了那么多数据库表的配置,实现起来有点复杂。

方案3:使用Java的线程休眠或定时器

此方案直接被PASS掉,不支持高可用,节点挂掉或者重启,任务失效。最差的实现方式,切勿使用。

方案4:使用redis的空间键通知

redis的空间键通知是在2.8.0版本以后加入的,客户端通过发布订阅的方式,订阅某个频道,接收通过某种方式影响redis中数据的事件。简单来说,就是设置了Key的过期时间,当过期的时候redis会有通知功能。花了几个小时尝试了一把,感觉也挺复杂的,最主要的是目前这项功能有些缺陷,比如文档有提到:redis key的失效通知机制是基于其pub/sub模式的,这个模式有个致命的缺陷是,消息通知不能持久化,假如监听服务宕机期间,有key过期,那么这个失效通知就被忽略了。此方案应该比前面几种要好,但是经过再三考虑放弃。

方案5:使用apache ignite

有人推荐用ignite,问之原因,说和redis差不多,也是内存数据库,但是支持设置过期时间有通知功能,感兴趣的朋友可以自己去看相关资料。

方案6:使用rocketmq延时消息

rocketmq提供一种延时消息的解决方案,就是在特定的时间到了,消息才会被投递出去供consumer消费。 此种方案应该比前面任何一种方案都比较适合目前业务场景,而且rocketMQ开箱即用,使用简单,不用多说,就是它了。先来张阿里云官方提供的功能概览图。

jianj.png

重点关注下定时(延时)消息:允许消息生产者指定消息进行定时(延时)投递,最长支持 40 天。本来以为定时消息和延时消息是一码事,但是仔细翻看文档,眼睛一亮。  

1.概念介绍:

定时消息:Producer 将消息发送到消息队列 RocketMQ 服务端,但并不期望这条消息立马投递,而是推迟到在当前时间点之后的某一个时间投递到 Consumer 进行消费,该消息即定时消息。 

延时消息:Producer 将消息发送到消息队列 RocketMQ 服务端,但并不期望这条消息立马投递,而是延迟一定时间后才投递到 Consumer 进行消费,该消息即延时消息。 

定时消息与延时消息在代码配置上存在一些差异,但是最终达到的效果相同:消息在发送到消息队列 RocketMQ 服务端后并不会立马投递,而是根据消息中的属性延迟固定时间后才投递给消费者。  

2.适用场景:

定时消息和延时消息适用于以下一些场景:  

消息生产和消费有时间窗口要求:比如在电商交易中超时未支付关闭订单的场景,在订单创建时会发送一条 延时消息。这条消息将会在 30 分钟以后投递给消费者,消费者收到此消息后需要判断对应的订单是否已完成支付。 如支付未完成,则关闭订单。如已完成支付则忽略。 

通过消息触发一些定时任务,比如在某一固定时间点向用户发送提醒消息。  

3.使用方式:

定时消息和延时消息的使用在代码编写上存在略微的区别:  

发送定时消息需要明确指定消息发送时间点之后的某一时间点作为消息投递的时间点。  

发送延时消息时需要设定一个延时时间长度,消息将从当前发送时间点开始延迟固定时间之后才开始投递。

关于使用rocketmq定时消息和延时消息详情后面在实际项目中再补充。

(微信打赏)

(支付宝打赏)
原创不易,谢谢赞赏。你的支持就是我的动力,我会更加努力。
  1. 2019-09-10 10:08:05

    公司现在就我一个软件了,做了传感器项目,用的电信IOT。虽然现在数据可以实时变化了,真不敢保证投入使用之后会出现什么问题。跟作者比起来就是一个渣渣

  2. 2019-08-02 14:33:06

    最近也在参与物联网项目,但是很混乱,感觉作者的实力是真的强啊,学习了,感谢分享!十分感谢

    • 2019-08-02 14:47:59 - 管理员回复

      感谢这么高的评价,文章有人看,能帮到一些人,就已经体现价值了。

  3. 2019-07-16 17:51:00

    总结的很好,对我帮助很大,谢谢了

既然决定了用RocketMQ实现定时消息,就立马准备环境开始测试。为了省事直接在阿里云官网上买个RocketMQ简简单单,下面将整个过程分享下。

1核2G1M40G盘,89元/1年,2核4G3M40G盘,799元/3年,2核8G5M40G盘,1399元/3年,新老用户都支持。

阿里云产品1888元服务器代金券大礼包免费领取。

阿里云服务器低门槛上云捷径,普惠上云,云服务器1核1G仅需293元/年。

企业级高性能实例,限时2-5折,限首次购买ECS用户参与,限购4台。

腾讯云代金券新用户满200减150 满500减375 满1000减750 满2000减1500。

腾讯云服务器,数据库热卖云产品3折起,爆品低至1折。

腾讯云业界领先的性价比,0.57元/天起,关注最新活动,免费体验产品。