消息消費的幾種方式

一個web請求往往要求快速得到響應,但是一個請求對應的業務可能存在一些複雜、耗時的邏輯需要執行。此時,我們可以將後置邏輯以消息的形式將耗時的業務剝離出來。
那麼消息隊列的信息該如何消費呢?

使用crontab拉取消費進程

我們可以在crontab裏面配置一個定時任務來消費消息。比如,我們每隔1s拉起一個進程消費消息。
這樣的實現方式比較簡單。但是存在多個問題:

  1. 如果一個topic建立一個定時任務來處理,那麼crontab的數量會非常的巨大,後續改動crontab會難以維護;
  2. 如果我們只建立一個crontab,將多個消費任務放在配置中心,那麼所有的定時任務都必須依照同樣的格式(繼承同一個抽象基類)來實現任務;
  3. 如果定時間隔太太,消息消費不及時。定時間隔太小,進程的創建、上下文切換頻繁,服務器的資源利用效率低下;
  4. 如果出現消息堆積,定時間隔較小時,服務器上會拉起大量的進程(進程數量不可控),這些進程同時存在,併發生頻繁的上下文切換。此時消息消費進程,佔用了大量的服務器資源,嚴重的情況下可能導致服務器崩潰。

常駐內存的守護進程

功能概述

  1. 通過信號重啓、關閉進程,重啓的時候重新加載配置(隊列名稱 => job進程);
  2. 設置進程上限、請求處理數量上限,當處理請求次數達到上限時重啓進程,防止內存泄漏;
  3. 消費策略;

進程託管服務(遠程調用)

上面的兩個方法都必須要求你建立一個消息隊列,這樣的一個實現方式是比較重的。
如果我們把一個函數在一臺指定的服務器上執行,且這個函數無需任何的返回。這就相當於退化成爲一個沒有返回的RPC調用。
當發送的消息體積比較小,消息的發送間隔比較長(非實時流數據),可以考慮使用RPC服務。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章