成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

1分鐘實現“延遲消息”功能

開發 開發工具
如何利用“延時消息”,對于每個任務只觸發一次,保證效率的同時保證實時性,是今天要討論的問題。

一、緣起

很多時候,業務有“在一段時間之后,完成一個工作任務”的需求。

例如:滴滴打車訂單完成后,如果用戶一直不評價,48小時后會將自動評價為5星。

一般來說怎么實現這類“48小時后自動評價為5星”需求呢?

1. 常見方案:

啟動一個cron定時任務,每小時跑一次,將完成時間超過48小時的訂單取出,置為5星,并把評價狀態置為已評價。

假設訂單表的結構為:t_order(oid, finish_time, stars, status, …),更具體的,定時任務每隔一個小時會這么做一次:

  1. select oid from t_order where finish_time > 48hours and status=0
  2. update t_order set stars=5 and status=1 where oid in[…]; 

如果數據量很大,需要分頁查詢,分頁update,這將會是一個for循環。

2. 方案的不足:

(1)輪詢效率比較低

(2)每次掃庫,已經被執行過記錄,仍然會被掃描(只是不會出現在結果集中),有重復計算的嫌疑

(3)時效性不夠好,如果每小時輪詢一次,最差的情況下,時間誤差會達到1小時

(4)如果通過增加cron輪詢頻率來減少(3)中的時間誤差,(1)中輪詢低效和(2)中重復計算的問題會進一步凸顯

如何利用“延時消息”,對于每個任務只觸發一次,保證效率的同時保證實時性,是今天要討論的問題。

二、高效延時消息設計與實現

高效延時消息,包含兩個重要的數據結構:

  • 環形隊列,例如可以創建一個包含3600個slot的環形隊列(本質是個數組)
  • 任務集合,環上每一個slot是一個Set

同時,啟動一個timer,這個timer每隔1s,在上述環形隊列中移動一格,有一個Current Index指針來標識正在檢測的slot。

Task結構中有兩個很重要的屬性:

  • Cycle-Num:當Current Index第幾圈掃描到這個Slot時,執行任務
  • Task-Function:需要執行的任務指針

假設當前Current Index指向***格,當有延時消息到達之后,例如希望3610秒之后,觸發一個延時消息任務,只需:

  • 計算這個Task應該放在哪一個slot,現在指向1,3610秒之后,應該是第11格,所以這個Task應該放在第11個slot的Set
  • 計算這個Task的Cycle-Num,由于環形隊列是3600格(每秒移動一格,正好1小時),這個任務是3610秒后執行,所以應該繞3610/3600=1圈之后再執行,于是Cycle-Num=1

Current Index不停的移動,每秒移動到一個新slot,這個slot中對應的Set,每個Task看Cycle-Num是不是0:

  • 如果不是0,說明還需要多移動幾圈,將Cycle-Num減1
  • 如果是0,說明馬上要執行這個Task了,取出Task-Funciton執行(可以用單獨的線程來執行Task),并把這個Task從Set中刪除

使用了“延時消息”方案之后,“訂單48小時后關閉評價”的需求,只需將在訂單關閉時,觸發一個48小時之后的延時消息即可:

  • 無需再輪詢全部訂單,效率高
  • 一個訂單,任務只執行一次
  • 時效性好,精確到秒(控制timer移動頻率可以控制精度)

三、總結

環形隊列是一個實現“延時消息”的好方法,開源的MQ好像都不支持延遲消息,不妨自己實現一個簡易的“延時消息隊列”,能解決很多業務問題,并減少很多低效掃庫的cron任務。

【本文為51CTO專欄作者“58沈劍”原創稿件,轉載請聯系原作者】

戳這里,看該作者更多好文

責任編輯:趙寧寧 來源: 51CTO專欄
相關推薦

2015-11-23 17:34:33

秒借

2018-03-12 21:31:24

區塊鏈

2021-09-16 10:29:05

開發技能代碼

2018-03-12 14:37:50

區塊鏈比特幣架構

2018-03-23 11:56:09

相似性推薦推薦算法推薦

2009-11-16 09:53:56

PHP上傳類

2017-09-27 11:00:50

LinuxBash使用技巧

2024-04-01 09:59:08

消息隊列通信微服務

2024-09-13 08:49:45

2018-03-23 11:23:14

2017-02-22 14:46:04

Leader-Foll線程

2012-06-28 10:26:51

Silverlight

2023-12-08 13:19:00

前端Reactour流行庫

2023-08-24 09:01:25

消息拉取RocketMQ

2023-08-01 09:01:51

Broker? 事務消息selector

2023-08-14 09:16:26

消息存儲磁盤

2017-01-10 09:07:53

tcpdumpGET請求

2018-03-23 11:33:56

協同過濾程序算法

2011-10-11 10:01:26

2019-11-12 14:05:11

U盤LinuxRufus
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 成人av片在线观看 | 中文字幕亚洲一区 | 日韩欧美电影在线 | 在线成人免费视频 | aaa国产大片| 97精品超碰一区二区三区 | 在线视频三区 | 日韩电影中文字幕在线观看 | 91精品欧美久久久久久久 | 国产ts人妖系列高潮 | 久久久青草婷婷精品综合日韩 | 欧美日一区二区 | 亚洲午夜精品一区二区三区他趣 | 在线成人免费av | 欧美日韩专区 | 欧美中文字幕在线观看 | 久草视频在线播放 | 色婷婷综合久久久中文字幕 | 一区二区三区在线观看视频 | 欧美日韩国产精品一区 | 精品久久久久久久久久久 | 精品视频免费在线 | 一级a爱片性色毛片免费 | 国产精品波多野结衣 | 亚洲视频免费观看 | 久艹av| 第一av| 麻豆久久久9性大片 | 又黑又粗又长的欧美一区 | 国产激情视频在线观看 | 中文字幕亚洲欧美日韩在线不卡 | 日韩精品 电影一区 亚洲 | 欧美aaa| 成人亚洲网 | 久久久精彩视频 | 国产免费一区二区 | 精品91久久 | 毛片免费观看视频 | 亚洲第一色av | 精品视频一区二区三区在线观看 | 羞羞视频免费观 |