所謂模板消息,就是內容不能徹底自定義,必須聽從一個固定模板的對點消息。模板消息的本質是受限制的推送消息,這種限制來源於兩個方面:一是模板消息原則上是由用戶觸發的,在用戶不做受權的狀況下,小程序沒法向用戶隨意主動推送消息;二是模板消息必需經由微信提供的官方API纔可以發送,這個API限制了模板消息的內容。前端
爲了可以對某一個特定用戶發送模板消息,後端服務器必須擁有該用戶生成的form_id才行。form_id是小程序前端生成的一串標識碼,一個form_id可用於發送一條模板消息。咱們的小程序的功能需求是在社團活動開始前一天能夠發送一條模板消息提醒用戶,所以咱們將form_id的收集按鍵和活動的關注按鈕作在了一塊兒,用戶每點擊一次關注活動,小程序就能夠收集到一條form_id,並調用後端提供的接口發送給後端。數據庫
form_id相關操做是一個很高頻的操做,並且form_id的有效期只有短短7天,不適合使用數據庫存儲。對於這樣的高頻I/O操做,咱們選擇了Redis保存和查詢form_id。Redis是一個K-V數據庫,對於form_id而言,因爲一個form_id對應一個用戶,咱們使用user_id_form_ids_key
做爲Redis鍵值對的鍵,{form_id: form_id, expire_time: Time.now + 7.days}
組成的數組做爲值。每當有向用戶發送模板消息的需求時,經過用戶的key取出一個form_id,而後發送消息便可。小程序
小程序的限制註定了每一個form_id只有7天的有效期。所以,爲了不使用一個過時的form_id,form_id要常常被更新才能夠。咱們把form_id存儲在一個數組中,每次取form_id時,先過濾一遍這個數組,將過時的form_id所有刪除,再取出最先的一個form_id發送給微信的API。後端
因爲咱們須要在用戶關注的活動開始的前一天向用戶推送一條模板消息,所以須要設置一個定時任務來每隔一段時間掃描一次數據庫,判斷是否有活動即將開始而還未通知用戶。咱們使用了Rails做爲後端框架,選擇了sidekiq-scheduler做爲定時任務的驅動器,每十分鐘掃描一次數據庫,選取那些有人關注的活動,而後對每一個關注了此活動而還未收到通知的用戶發送一條模板消息。數組