微信公眾號開發推送事件排重

Hwan發表於2019-02-16

問題描述

在處理使用者領卡的推送的時候,我們的資料庫對同一個新的使用者,會出現兩條資料,比如兩條使用者,兩條使用者領卡資料

問題分析

出現這種的原因在於以下兩點:

  • 伺服器有點卡,沒有來得及在5秒之內回覆微信伺服器,導致微信伺服器重發請求
  • 雖然在插入資料之前有所檢查有無重複資料,但是可能伺服器很卡,在檢查的時候,前一條請求的資料還沒有插入資料庫

處理方法

參考微信開發文件,利用FromUserName + CreateTime排重,將其作為一個key,存放在memcached裡面,然後每次有推送或者訊息來得時候,先去判斷一下是否存在,如果存在,表示是重複推送,直接return空串,否則表示是第一次推送,將其作為一個key,簡要程式碼如下:

mc = memcached_wrapper.getMemcached()
FromUserName = self.decrypt_msg.find("FromUserName").text
CreateTime = self.decrypt_msg.find("CreateTime").text
mc_key_str = Util.unicode2str(FromUserName + CreateTime)
mc_value_str = mc.get(mc_key_str)
if mc_value_str:
    mc.disconnect_all()
    return ""
else:
    mc.set(mc_key_str, 1, 60)
    mc.disconnect_all()
# 備註
# unicode2str將unicode字串轉化為bytes串
# memcached_wrapper一個處理memcached的py檔案,主要作用是連線memcached和複用連線等功能

好了,就先到這裡了,記錄下來以便下次查閱,如果對於你也有幫助的話,那真是最好不過的了

相關文章