男朋友给我买的订婚首饰,由于他缺乏安全意识,放置于汽车后备箱,以为锁着就安全了,结果遭遇了小偷,丢失了一条20克的黄金项链
小偷也是很奇怪,钻戒对戒和黄金镯子都没有偷走,唯独偷走了项链。6日早晨我来到南通崇川区唐人新街查看监控,查到下午将近两点查出线索,监控里显示4月4日晚上11点27分两个小年轻出现在了监控,一直在我男朋友车周围盘旋,其中一人在路边车头处把风,一人作案,之后还游走于西侧车辆拉其他车门,直到11点40分,离开了监控视线,离开之时其实一人抬头发现了监控,还踹了监控柱子。
6日下午1点58分我报了警,随后去了唐闸派出所做了笔录,民警让我回家等通知,有线索会联系我,之后也一直没什么音讯。
原本我与男朋友定于本月28日订婚,5月20日领证,因为项链被偷了,我们一直不敢告诉我未来的婆婆,怕长辈担心,今天已是26号了,打了几次派出所电话得到的都是接线员说的等通知,于是今天又跑了一趟唐闸派出所还是无果,建议我不要抱太大希望,还是重新去买一条项链,小偷不一定能找到。借着疫情做挡箭牌,我们只能把订婚延期到5月初。只想说可恶的小偷,为什么要偷我们结婚用的东西,让我好糟心,终究还是挺难过的,本想开开心心的结婚,却发生这样的事,不能把小偷抓到更是让我气愤,他们在外面逍遥法外,未来还要盗窃更多人的钱财,每个家庭都不易,东西被偷了真的很难过。也不知道这个案子最后能不能破了,警察能抓到小偷吗?
最后还是提醒大家,贵重物品不要放车上,不安全,不要抱有侥幸心理哦。
小偷也是很奇怪,钻戒对戒和黄金镯子都没有偷走,唯独偷走了项链。6日早晨我来到南通崇川区唐人新街查看监控,查到下午将近两点查出线索,监控里显示4月4日晚上11点27分两个小年轻出现在了监控,一直在我男朋友车周围盘旋,其中一人在路边车头处把风,一人作案,之后还游走于西侧车辆拉其他车门,直到11点40分,离开了监控视线,离开之时其实一人抬头发现了监控,还踹了监控柱子。
6日下午1点58分我报了警,随后去了唐闸派出所做了笔录,民警让我回家等通知,有线索会联系我,之后也一直没什么音讯。
原本我与男朋友定于本月28日订婚,5月20日领证,因为项链被偷了,我们一直不敢告诉我未来的婆婆,怕长辈担心,今天已是26号了,打了几次派出所电话得到的都是接线员说的等通知,于是今天又跑了一趟唐闸派出所还是无果,建议我不要抱太大希望,还是重新去买一条项链,小偷不一定能找到。借着疫情做挡箭牌,我们只能把订婚延期到5月初。只想说可恶的小偷,为什么要偷我们结婚用的东西,让我好糟心,终究还是挺难过的,本想开开心心的结婚,却发生这样的事,不能把小偷抓到更是让我气愤,他们在外面逍遥法外,未来还要盗窃更多人的钱财,每个家庭都不易,东西被偷了真的很难过。也不知道这个案子最后能不能破了,警察能抓到小偷吗?
最后还是提醒大家,贵重物品不要放车上,不安全,不要抱有侥幸心理哦。
领导看了同事写的关闭超时订单,让他出门左转!
关闭超时订单是在创建订单之后的一段时间内未完成支付而关闭订单的操作,该功能一般要求每笔订单的超时时间是一致的。
如果我们使用定时任务来进行该操作,很难把握定时任务轮询的时间间隔
时间间隔足够小,在误差允许的范围内可以达到我们说的时间一致性问题,但是频繁扫描数据库,执行定时任务,会造成网络IO和磁盘IO的消耗,对实时交易造成一定的冲击
时间间隔比较大,由于每个订单创建的时间不一致,所以上边的一致性要求很难达到
假设30分钟订单超时自动关闭,定时任务的执行间隔时间为30分钟:
第5分钟进行下单操作
当时间来到第30分钟时,定时任务执行一次,但是我们的订单未满足条件,不执行
当时间来到第35分钟时,订单达到关闭条件,但是定时任务未执行,所以不执行
当时间来到第60分钟时,开始执行我们的订单关闭操作,而此时,误差达到25分钟
经此种种,我们需要舍弃该方式。
延时队列
为了满足领导的需求,我便将手伸向了消息队列:RabbitMQ。尽管它本身并没有提供延时队列的功能,但是我们可以利用它的存活时间和死信交换机的特性来间接实现。
存活时间
存活时间的全拼是Time To Live,简称 TTL。它既支持对消息本身进行设置(延迟队列的关键),又支持对队列进行设置(该队列中所有消息存在相同的过期时间)
对消息本身进行设置:即使消息过期,也不会马上从队列中抹去,因为每条消息是否过期是在即将投递到消费者之前判定的
对队列进行设置:一旦消息过期,就会从队列中抹去
如果同时使用这两种方法,那么以过期时间小的那个数值为准。当消息达到过期时间还没有被消费,那么该消息就“死了”,我们把它称为 死信 消息。
消息变为死信的条件
消息被拒绝(basic.reject/basic.nack),并且requeue=false
消息的过期时间到期了
队列达到最大长度
队列设置注意事项
队列中该属性的设置要在第一次声明队列的时候设置才有效,如果队列一开始已存在且没有这个属性,则要删掉队列再重新声明才可以;
队列的 ttl 只能被设置为某个固定的值,一旦设置后则不能更改,否则会抛出异常;
死信交换机
死信交换机全拼Dead-Letter-Exchange,简称DLX。
当消息在一个队列中变成死信之后,如果这个消息所在的队列设置了x-dead-letter-exchange参数,那么它会被发送到x-dead-letter-exchange对应值的交换机上,这个交换机就称之为死信交换机,与这个死信交换器绑定的队列就是死信队列。
x-dead-letter-exchange:出现死信之后将死信重新发送到指定交换机
x-dead-letter-routing-key:出现死信之后将死信重新按照指定的routing-key发送,如果不设置默认使用消息本身的routing-key
死信队列与普通队列的区别就是它的RoutingKey和Exchange需要作为参数,绑定到正常的队列上。
生产者发送带有 ttl 的消息放入交换机路由到延时队列中
在延时队列中绑定死信交换机与死信转发的routing-key
等延时队列中的消息达到延时时间之后变成死信转发到死信交换机并路由到死信队列中
最后供消费者消费
通过调用接口,发现10秒之后才会消费消息
问题升级
由于开发环境和测试环境使用的是同一个交换机和队列,所以发送的延时时间都是30分钟。但为了在测试环境让测试同学方便测试,故手动将测试环境的时间改为了1分钟。
接着问题就来了:延时时间为1分钟的消息并没有立即被消费,而是等30分钟的消息被消费完之后才被消费了
原因就是延时队列也满足队列先进先出的特征,当10秒的消息未出队列时,后边的消息不能顺利出队,造成后边的消息阻塞了,未能达到精准延时。
我们可以利用x-delay-message插件来解决
生产者发送消息到交换机时,并不会立即进入,而是先将消息持久化到 Mnesia(一个分布式数据库管理系统)
插件将会尝试确认消息是否过期
若消息过期,消息会通过 x-delayed-type 类型标记的交换机投递至目标队列,供消费者消费
局限性
延迟的消息存储在一个Mnesia表中,当前节点上只有一个磁盘副本,它们将在节点重启后存活。
虽然触发计划交付的计时器不会持久化,但它将在节点启动时的插件激活期间重新初始化。显然,集群中只有一个预定消息的副本意味着丢失该节点或禁用其上的插件将丢失驻留在该节点上的消息。
该插件的当前设计并不适合延迟消息数量较多的场景(如数万条或数百万条),另外该插件的一个可变性来源是依赖于 Erlang 计时器,在系统中使用了一定数量的长时间计时器之后,它们开始争用调度程序资源,并且时间漂移不断累积。
关闭超时订单是在创建订单之后的一段时间内未完成支付而关闭订单的操作,该功能一般要求每笔订单的超时时间是一致的。
如果我们使用定时任务来进行该操作,很难把握定时任务轮询的时间间隔
时间间隔足够小,在误差允许的范围内可以达到我们说的时间一致性问题,但是频繁扫描数据库,执行定时任务,会造成网络IO和磁盘IO的消耗,对实时交易造成一定的冲击
时间间隔比较大,由于每个订单创建的时间不一致,所以上边的一致性要求很难达到
假设30分钟订单超时自动关闭,定时任务的执行间隔时间为30分钟:
第5分钟进行下单操作
当时间来到第30分钟时,定时任务执行一次,但是我们的订单未满足条件,不执行
当时间来到第35分钟时,订单达到关闭条件,但是定时任务未执行,所以不执行
当时间来到第60分钟时,开始执行我们的订单关闭操作,而此时,误差达到25分钟
经此种种,我们需要舍弃该方式。
延时队列
为了满足领导的需求,我便将手伸向了消息队列:RabbitMQ。尽管它本身并没有提供延时队列的功能,但是我们可以利用它的存活时间和死信交换机的特性来间接实现。
存活时间
存活时间的全拼是Time To Live,简称 TTL。它既支持对消息本身进行设置(延迟队列的关键),又支持对队列进行设置(该队列中所有消息存在相同的过期时间)
对消息本身进行设置:即使消息过期,也不会马上从队列中抹去,因为每条消息是否过期是在即将投递到消费者之前判定的
对队列进行设置:一旦消息过期,就会从队列中抹去
如果同时使用这两种方法,那么以过期时间小的那个数值为准。当消息达到过期时间还没有被消费,那么该消息就“死了”,我们把它称为 死信 消息。
消息变为死信的条件
消息被拒绝(basic.reject/basic.nack),并且requeue=false
消息的过期时间到期了
队列达到最大长度
队列设置注意事项
队列中该属性的设置要在第一次声明队列的时候设置才有效,如果队列一开始已存在且没有这个属性,则要删掉队列再重新声明才可以;
队列的 ttl 只能被设置为某个固定的值,一旦设置后则不能更改,否则会抛出异常;
死信交换机
死信交换机全拼Dead-Letter-Exchange,简称DLX。
当消息在一个队列中变成死信之后,如果这个消息所在的队列设置了x-dead-letter-exchange参数,那么它会被发送到x-dead-letter-exchange对应值的交换机上,这个交换机就称之为死信交换机,与这个死信交换器绑定的队列就是死信队列。
x-dead-letter-exchange:出现死信之后将死信重新发送到指定交换机
x-dead-letter-routing-key:出现死信之后将死信重新按照指定的routing-key发送,如果不设置默认使用消息本身的routing-key
死信队列与普通队列的区别就是它的RoutingKey和Exchange需要作为参数,绑定到正常的队列上。
生产者发送带有 ttl 的消息放入交换机路由到延时队列中
在延时队列中绑定死信交换机与死信转发的routing-key
等延时队列中的消息达到延时时间之后变成死信转发到死信交换机并路由到死信队列中
最后供消费者消费
通过调用接口,发现10秒之后才会消费消息
问题升级
由于开发环境和测试环境使用的是同一个交换机和队列,所以发送的延时时间都是30分钟。但为了在测试环境让测试同学方便测试,故手动将测试环境的时间改为了1分钟。
接着问题就来了:延时时间为1分钟的消息并没有立即被消费,而是等30分钟的消息被消费完之后才被消费了
原因就是延时队列也满足队列先进先出的特征,当10秒的消息未出队列时,后边的消息不能顺利出队,造成后边的消息阻塞了,未能达到精准延时。
我们可以利用x-delay-message插件来解决
生产者发送消息到交换机时,并不会立即进入,而是先将消息持久化到 Mnesia(一个分布式数据库管理系统)
插件将会尝试确认消息是否过期
若消息过期,消息会通过 x-delayed-type 类型标记的交换机投递至目标队列,供消费者消费
局限性
延迟的消息存储在一个Mnesia表中,当前节点上只有一个磁盘副本,它们将在节点重启后存活。
虽然触发计划交付的计时器不会持久化,但它将在节点启动时的插件激活期间重新初始化。显然,集群中只有一个预定消息的副本意味着丢失该节点或禁用其上的插件将丢失驻留在该节点上的消息。
该插件的当前设计并不适合延迟消息数量较多的场景(如数万条或数百万条),另外该插件的一个可变性来源是依赖于 Erlang 计时器,在系统中使用了一定数量的长时间计时器之后,它们开始争用调度程序资源,并且时间漂移不断累积。
祝卿好收官:三对圆满,只有他孤身一人,还多了个小混世魔王沈宴追回了丢失的库银,也将刘泠带了回来,两人因此被赐婚,应该是皆大欢喜了,可外公的身体越来越差,他们想着急完婚,刘泠是为了外公,沈宴还有别的意图。当坐在花轿中的时候,刘泠抚摸着腕上的红绳,悄悄掀起了盖头,沈宴则是在焦急等待,两位也是圆满了,洞花烛,达成所愿。不过小编觉得他们的结婚礼服有些差呀,你们觉得呢?
✋热门推荐