簡體   English   中英

電子郵件、短信等通知的 DND(請勿打擾)功能

[英]DND (Do not disturb) feature for notifications like email,sms etc

我創建了用於發送多個通知(如電子郵件、短信等)的微服務,這些通知正在使用來自 kafka 的通知。 我希望像 DND 這樣的用戶偏好被視為用戶不應在指定的 DND 期間收到通知。

我怎樣才能實現這個免打擾功能,因為 kafka 會不斷地向我發送帶有時間戳(發送消息的日期和時間)的消息,應該在什么時間觸發通知並確認用戶不會在訂閱的免打擾期間收到這些通知?

我能得到一些幫助嗎?

我對 Kafka 的經驗並不完全,但我對微服務架構和消息隊列有一些了解。

由於微服務正在消費來自 Queue 或 Kafka 的任務,因此可以在消費微服務中實現 DND。 它可能需要執行額外的任務來檢查用戶是否在 DND 中,然后發送通知。

但是,微服務是特定於任務的,最好只發送通知,因此也許可以修改將任務發布到 Kafka 的應用程序/微服務。

微服務 A -> Kafka -> 通知微服務(B)

微服務 A 可以在傳遞給 Kafka 之前檢查 DND 或

微服務 A 可以將用戶免打擾時間段信息以及其他通知詳細信息附加到 Kafka。 現在,當 B 從 Kafka 接收/消費時,它會檢查它是否在 DND 期間內,否則將忽略它。

----在第一條評論后添加----

我認為DND中的通知可以丟棄。 以下是我們可以在稍后發送通知的操作。

---- 答案是基於上述架構----

要稍后發送通知而不丟棄它,您可以創建另一個本地隊列(數組或任何可行的數據結構)或使用內存隊列,如 Redis。

現在根據我之前的建議,現在我們可以避免將其發送並放入這個新創建的隊列中,而不是丟棄落在 DND 中的通知。

微服務 B 可以有一個調度程序,比如說每 15 分鍾一次。

此外,假設如我之前所述,通知將具有 DND 參數(由於此隊列包含已跳過的通知,因此不再需要或有效發送實際時間)

現在每 15 分鍾(或任何設置的時間),微服務 B 可以檢查此隊列的內容並僅在它超出 DND 時發送通知,最后將其從隊列中刪除。

如果時間仍在 DND 中,我們會將通知保留在隊列中而不將其刪除,因此它會在 15 分鍾(設置的時間)后再次提取以進行處理。

最后,如果 B 已經過載,我們可以創建另一個簡單的微服務,如果通知在 DND 內,它將每 15 分鍾檢查一次這個新隊列,並將其傳遞給微服務 B 以發送實際通知。

在使用來自通知主題的消息后,您可以根據 DND 邏輯分離消息。 發布您可以將其寫回另一個 Kafka 主題的帖子,例如dnd-notifications並從那里讀取。 由於 Kafka 用於exactly-once交付,因此您必須將 dnd 消息推送到新主題。

9 月 26 日編輯:

事后看來,將您的免打擾通知放在單獨的主題中是行不通的,例如“如果用戶的免打擾時間持續超過 7 天怎么辦”。 Kafka 默認情況下,消息保留時間為 7 天(您可以增加),但 kafka 不用於存儲。

您需要做的是涉及一個數據庫並擁有 2 個微服務。 一個微服務將是一個消費者微服務,它將讀取 kafka 並將消息寫入數據庫中帶有標志的表(即is_read ,如果消息已經推送給用戶並讀取, is_read true )。 默認情況下,對於任何新消息, is_read將為 false。

第二個微服務將是考慮到用戶 dnd-configuration 實際推送通知的服務。 它應該從數據庫中讀取所有未讀消息表,檢查用戶 dnd-config,然后推送給用戶。 這第二個服務可以定期輪詢數據庫並發送未讀消息。 在此處輸入圖片說明

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM