<menu id="guoca"></menu>
<nav id="guoca"></nav><xmp id="guoca">
  • <xmp id="guoca">
  • <nav id="guoca"><code id="guoca"></code></nav>
  • <nav id="guoca"><code id="guoca"></code></nav>

    永遠不要使用Redis過期監聽實現定時任務!

    VSole2022-07-03 17:01:34

    前言

    日前拜讀阿牛老師的大作《領導:誰再用定時任務實現關閉訂單,立馬滾蛋!》發現其方案有若干瑕疵,特此拋磚引玉討論一二。

    https://juejin.cn/post/6987233263660040206
    

    在電商、支付等領域,往往會有這樣的場景,用戶下單后放棄支付了,那這筆訂單會在指定的時間段后進行關閉操作。

    細心的你一定發現了像某寶、某東都有這樣的邏輯,而且時間很準確,誤差在 1s 內,那他們是怎么實現的呢?

    一般實現的方法有幾種:

    • 使用 RocketMQ、RabbitMQ、Pulsar 等消息隊列的延時投遞功能
    • 使用 Redisson 提供的 DelayedQueue

    有一些方案雖然廣為流傳但存在著致命缺陷,不要用來實現延時任務:

    • 使用 Redis 的過期監聽
    • 使用 RabbitMQ 的死信隊列
    • 使用非持久化的時間輪

    Redis 過期監聽

    在 Redis 官方手冊的 keyspace-notifications: timing-of-expired-events 中明確指出:

    Basically expired events are generated when the Redis server deletes the key and not when the time to live theoretically reaches the value of zero

    Redis 自動過期的實現方式是:定時任務離線掃描并刪除部分過期鍵;在訪問鍵時惰性檢查是否過期并刪除過期鍵。

    Redis 從未保證會在設定的過期時間立即刪除并發送過期通知。實際上,過期通知晚于設定的過期時間數分鐘的情況也比較常見。

    此外鍵空間通知采用的是發送即忘(fire and forget)策略,并不像消息隊列一樣保證送達。當訂閱事件的客戶端會丟失所有在斷線期間所有分發給它的事件。

    這是一種比定時掃描數據庫更 “LOW” 的解決方案,請不要使用。

    有另一位大佬做了測試《請勿過度依賴Redis的過期監聽》,有興趣的朋友可以自行查閱。

    https://juejin.cn/post/6844904158227595271
    

    RabbitMQ 死信

    死信(Dead Letter)是 RabbitMQ 提供的一種機制。

    當一條消息滿足下列條件之一那么它會成為死信:

    • 消息被否定確認(如 channel.basicNack)并且此時 requeue 屬性被設置為 false。
    • 消息在隊列的存活時間超過設置的 TTL 時間
    • 消息隊列的消息數量已經超過最大隊列長度


    若配置了死信隊列,死信會被 RabbitMQ 投到死信隊列中。

    在 RabbitMQ 中創建死信隊列的操作流程大概是:

    • 創建一個交換機作為死信交換機
    • 在業務隊列中配置 x-dead-letter-exchange 和 x-dead-letter-routing-key,將第一步的交換機設為業務隊列的死信交換機
    • 在死信交換機上創建隊列,并監聽此隊列

    死信隊列的設計目的是為了存儲沒有被正常消費的消息,便于排查和重新投遞。死信隊列同樣也沒有對投遞時間做出保證,在第一條消息成為死信之前,后面的消息即使過期也不會投遞為死信。

    為了解決這個問題,Rabbit 官方推出了延遲投遞插件 rabbitmq-delayed-message-exchange ,推薦使用官方插件來做延時消息。

    這里說點題外話,使用 Redis 過期監聽或者 RabbitMQ 死信隊列做延時任務都是以設計者預想之外的方式使用中間件,這種出其不意必自斃的行為通常會存在某些隱患,比如缺乏一致性和可靠性保證,吞吐量較低、資源泄漏等。

    比較出名的一個事例是很多人使用 Redis 的 List 作為消息隊列,以致于最后作者看不下去寫了 Disque 并最后演變為 Redis Stream。工作中還是盡量不要濫用中間件,用專業的組件做專業的事。

    時間輪

    時間輪是一種很優秀的定時任務的數據結構,然而絕大多數時間輪實現是純內存沒有持久化的。

    運行時間輪的進程崩潰之后其中所有的任務都會灰飛煙滅,所以奉勸各位勇士謹慎使用。

    | Redisson DelayQueue

    Redisson DelayQueue 是一種基于 Redis Zset 結構的延時隊列實現。DelayQueue 中有一個名為 timeoutSetName 的有序集合,其中元素的 score 為投遞時間戳。

    DelayQueue 會定時使用 zrangebyscore 掃描已到投遞時間的消息,然后把它們移動到就緒消息列表中。

    DelayQueue 保證 Redis 不崩潰的情況下不會丟失消息,在沒有更好的解決方案時不妨一試。

    在數據庫索引設計良好的情況下,定時掃描數據庫中未完成的訂單產生的開銷并沒有想象中那么大。

    在使用 Redisson DelayQueue 等定時任務中間件時可以同時使用掃描數據庫的方法作為補償機制,避免中間件故障造成任務丟失。

    結論

    總結了幾點如下:

    • 首先推薦使用 RocketMQ、Pulsar 等擁有定時投遞功能的消息隊列。
    • 在不方便獲得專業消息隊列時可以考慮使用 Redisson DelayQueue 等基于 Redis 的延時隊列方案,但要為 Redis 崩潰等情況設計補償保護機制。
    • 在無法使用 Redisson DelayQueue 等方案時可以考慮使用時間輪。由于時間輪重啟遠比 Redis 重啟要頻繁,定時掃庫等保護機制更為重要。
    • 永遠不要使用 Redis 過期監聽實現定時任務。
    交換機redis
    本作品采用《CC 協議》,轉載必須注明作者和本文鏈接
    前言日前拜讀阿牛老師的大作《領導:誰再用定時任務實現關閉訂單,立馬滾蛋!》發現其方案有若干瑕疵,特此拋磚引玉討論一二。在使用 Redisson DelayQueue 等定時任務中間件時可以同時使用掃描數據庫的方法作為補償機制,避免中間件故障造成任務丟失。
    .Net之延遲隊列
    2022-07-27 17:54:49
    介紹具有隊列的特性,再給它附加一個延遲消費隊列消息的功能,也就是說可以指定隊列中的消息在哪個時間點被消費。
    同時又在默認的系統環境下,通過pip安裝部署,大多數情況下,是不會出現問題。相關的依賴庫,在Python安裝之后,都是通過pip來安裝。但實際我們裝個python2.7版本的環境就基本滿足目前的需求。我們創建了一個叫做py27的虛擬環境。workonpy272.4 安裝Opencananrypip在安裝opencanary時,會自動安裝他所需求要的各種依賴,一般不出問題的話,一切都會順利安裝完成。
    現在我們手上有外網路由器的管理權限還有內網無線ap的權限,外網路由器可以telnet、ping探測IP和端口存活、nat端口映射。總算找到一個可以打的端口,這里在華三路由器telnet過去我不知道為啥我輸入info沒有返回未授權的信息,映射到外網輸入info是直接返回未授權,直接端口映射到外網直接用fscan打一下。蕪湖,fscan創建個計劃任務彈到vps上面。
    鑒于世上有著許多的 Linux 專家和開發者,顯然還存在其他的網絡監控工具,但在這篇教程中,我不打算將它們所有包括在內。它按每個進程來分組帶寬,而不是像大多數的工具那樣按照每個協議或每個子網來劃分流量。對我而言, nethogs 是非常容易使用的,或許是因為我非常喜歡它,以至于我總是在我的 Ubuntu 12.04 LTS 機器中使用它來監控我的網絡帶寬。例如要想使用混雜模式來嗅探,可以像下面展示的命令那樣使用選項 -p:nethogs -p wlan0
    用戶名:加密密碼:密碼最后一次修改日期:兩次密碼的修改時間間隔:密碼有效期:密碼修改到期到的警告天數:密碼過期之后的寬限天數:賬號失效時間:保留。查看下pid所對應的進程文件路徑,
    一文讀懂HW護網行動
    2022-07-26 12:00:00
    隨著《網絡安全法》和《等級保護制度條例2.0》的頒布,國內企業的網絡安全建設需與時俱進,要更加注重業務場景的安全性并合理部署網絡安全硬件產品,嚴防死守“網絡安全”底線。“HW行動”大幕開啟,國聯易安誓為政府、企事業單位網絡安全護航!
    安全區域邊界在近幾年變得越來越精細越來越模糊,因為攻擊的形式、病毒傳播的途徑層出不窮,我以攻擊者的角度去看,任何一個漏洞都可以成為勒索病毒傳播和利用的方式,我們要做到全面補丁壓力重重,通過邊界劃分,依靠不同的邊界安全防護,在發生問題的情況下將損失降到最低。
    痛苦的純文本日志管理日子一去不復返了。雖然純文本數據在某些情況下仍然很有用,但是在進行擴展分析以收集有洞察力的基礎設施數據并改進代碼質量時,尋找一個可靠的日志管理解決方案是值得的,該解決方案可以增強業務工作流的能力。 日志不是一件容易處理的事情,但無論如何都是任何生產系統的一個重要方面。當您面臨一個困難的問題時,使用日志管理解決方案要比在遍布系統環境的無休止的文本文件循環中穿梭容易得多。
    VSole
    網絡安全專家
      亚洲 欧美 自拍 唯美 另类