這篇文章將為大家詳細講解有關微信開發(fā)之如何實現報警排查,小編覺得挺實用的,因此分享給大家做個參考,希望大家閱讀完這篇文章后可以有所收獲。
創(chuàng)新互聯建站技術團隊十年來致力于為客戶提供做網站、網站設計、品牌網站設計、全網整合營銷推廣、搜索引擎SEO優(yōu)化等服務。經過多年發(fā)展,公司擁有經驗豐富的技術團隊,先后服務、推廣了數千家網站,包括各類中小企業(yè)、企事單位、高校等機構單位。
概要說明
微信公眾平臺已對外開放接口報警,當微信服務器向開發(fā)者推送消息失敗次數達到預定閾值時,會將報警消息發(fā)送到指定微信報警群中(設置方式:公眾平臺->開發(fā)者中心->接口報警),請開發(fā)者積極主動關注報警,即時解決故障,提高微信公眾號的服務質量。
為了更好地根據報警信息尾部的實例(提供了openid及時間戳stamp)進行問題排查,開發(fā)者需要在接入層、邏輯層等每一個層級都加上包含關鍵信息的詳細日志,以利于快速定位問題。
報警目前有2類:
1.通用報警,所有開發(fā)者都需要關注。
2.公眾號第三方平臺報警,只有在微信開放平臺(open.weixin.qq.com)上申請成為公眾號第三方平臺的開發(fā)者,才需要關注此報警。
下面對具體的報警做示例以及排查指引說明。
報警內容說明
報警內容描述:
a)appid:公眾號appid
b)昵稱: 公眾號昵稱
c)時間:所有報警,都會提供首次發(fā)生異常的時間。(如首次發(fā)生超時的時間,首次發(fā)生回應失敗的時間)
d)內容:錯誤的具體描述
e)次數:發(fā)生失敗的次數
f)錯誤樣例:錯誤樣例里注明了一些幫助查找問題的信息。如:首次超時開發(fā)者的IP和推送消息類型。如果是回應失敗,錯誤樣例還會注明首次回應失敗時開發(fā)者的回包。
一般情況下,通過報警提供的IP,時間,消息類型,能夠比較快速的定位到第三方發(fā)生問題的原因。
報警示例1:超時報警
Appid: wxxxxxx
昵稱: WxNickName
時間: 2014-12-01 20:12:00
內容: 微信服務器向公眾號推送消息或事件后,開發(fā)者5秒內沒有返回
次數: 5分鐘 1272次
錯誤樣例: [IP=203.205.140.29][Event=UnSubscribe]
該報警表示:微信服務器向開發(fā)者推送取消關注事件時,開發(fā)者沒有在5秒內返回結果。在2014-12-01 20:12:00-2014-12-01 20:17:00這5分鐘內發(fā)生了1272次。其中這5分鐘內第一次發(fā)生超時的時間是:2014-12-01 20:12:00, 開發(fā)者的IP是:203.205.140.29,事件類型是取消關注事件。
報警示例2:回應失敗
Appid: wxxxx
昵稱: WxNickName
時間: 2014-12-01 20:12:00
內容: 微信服務器向公眾號推送消息或事件后,得到的回應不合法
次數: 5分鐘 1320次
錯誤樣例: [Event=Click] [ip=58.248.9.218][response_length=10][response_content=Error 500:]
該報警表示:微信服務器向開發(fā)者推送自定義菜單點擊事件時,開發(fā)者的返回結果不合法。在2014-12-01 20:12:00-2014-12-01 20:17:00這5分鐘內發(fā)生了1320次。其中這5分鐘內第一次發(fā)生回應失敗的時間是:2014-12-01 20:12:00, 開發(fā)者的IP是:58.248.9.218,事件類型是點擊菜單事件,第三方返回的內容長度為10個字節(jié),內容為“Error 500:”。
報警示例3:連接超時
Appid: wxxxx
昵稱: WxNickName
時間: 2015-02-04 20:13:09
內容: 微信服務器連接公眾號開發(fā)者服務器時發(fā)生超時,超時時間為5秒
次數: 5分鐘 7289次
錯誤樣例: [IP=180.150.190.135][Msg=Text]
該報警表示:微信服務器向開發(fā)者推送粉絲發(fā)來的文本消息時,無法連接到開發(fā)者填寫的服務器地址。在2015-02-04 20:13:09-2015-02-04 20:18:00這5分鐘內發(fā)生了7289次,這5分鐘內第一次發(fā)生連接超時的時間是:2015-02-04 20:13:09, 開發(fā)者的IP是:180.150.190.135,事件類型是用戶推送的消息。
各類報警的排查方法
1.DNS失敗
該錯誤為微信服務器在推送消息給開發(fā)者時,解析dns失敗。如遇到此報警,請開發(fā)者確認:
a)填寫的url,域名是否有誤;
b) 域名是否發(fā)生變化,如過期,更新等。
如果不是以上2個問題,請聯系微信公眾平臺。
2.Dns超時
目前不會有此錯誤。
3.連接超時
該錯誤是微信服務器和開發(fā)者服務器3S內未連接成功。報警消息會提供出首次發(fā)生連接失敗的時間和連接的IP。如遇此報警,請開發(fā)者確認:
a)該IP是否有誤。
b)該IP機器是否過載,連接過多。
c)如果是第三方提供服務器托管,托管商是否有故障。
d)網絡運營商是否有故障。
4.請求超時
微信服務器向開發(fā)者服務器推送消息或事件,開發(fā)者5秒內沒有返回。請求超時時,報警消息會提供第一次出現請求超時的時間,開發(fā)者IP和消息類型。請開發(fā)者確認:
a)該IP是否有誤
b)該IP是否接收到報警消息給出的該消息類型的請求
c)該請求是否處理時間過長
5.回應失敗
開發(fā)者沒有按照wiki中的回復消息格式進行回復消息,或者發(fā)生網絡錯誤,會報警回應失敗,報警消息會提供第一次出現請求回應失敗的時間,開發(fā)者的IP,消息類型以及回應的消息內容,請開發(fā)者確認:
a)該IP是否有誤
b)該IP是否發(fā)生網絡錯誤
c)該業(yè)務處理邏輯是否沒有按照wiki規(guī)范回復消息,或是進入了異常邏輯。
6.MarkFail(自動屏蔽)
微信后臺會實時統計開發(fā)者的失敗次數。在推送消息給開發(fā)者發(fā)生大量失敗時,微信服務器會自動屏蔽開發(fā)者,1分鐘內不再推送任何消息,并會發(fā)送報警到微信群。此報警是級別最高的報警,開發(fā)者在收到此報警時請盡快處理后臺故障,恢復服務。事實上,開發(fā)者在收到此報警前,必然會收到連接超時,請求超時或回應失敗等報警,需要開發(fā)者即時去解決這些故障,避免被微信服務器屏蔽,嚴重影響公眾號服務!
7.推送component_verify_ticket超時 & 8.推送component_verify_ticket失敗 & 9.推送組件消息超時 & 10.推送組件消息失敗
以上4個報警只有公眾號第三方平臺開發(fā)者會收到,其他公眾號開發(fā)者無需關注。由于公眾號第三方平臺承載了更多的公眾號,所以公眾號第三方平臺的服務質量需要更嚴格要求和報警,所以把這4個特殊的事件單獨報警。具體的問題查找方式與4,5是一樣的,這里不在贅述。關于公眾號第三方平臺的具體申請與開發(fā)實現,請前往微信開放平臺(open.weixin.qq.com)
常見問題
1.如何排查DNS失敗的問題?
1.Ping測試你們MP上配置的url里的域名,確認是否能夠得到正確的IP。如不能得到或者錯誤,請到你們的域名托管商管理系統上檢查配置。
2.如1能夠得到正確的IP,又有DNS失敗的報警;請使用DNS服務器182.254.116.116 來再測試驗證。Linux : dig @182.254.116.116 域名;windows 修改網絡配置里的DNS服務器地址,然后再ping 域名。如果得到的IP不正確或者得不到,請聯系微信團隊。
2.如何解決連接超時問題?
1.查看是否網絡環(huán)境問題。
(1)使用公眾平臺接口,獲取到微信回調服務器的IP,api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN,
(2)在你們的服務上ping 測試,檢查你們服務器到微信回調用服務器的網絡質量情況。如有網絡問題,請聯系你們的服務器提供商解決。
2.查看接入層服務器連接數,負載,nginx的配置,允許的連接個數。查看nginx錯誤日志是否有“Connection reset by peer”或“Connection timed out”錯誤日志,如有說明nginx連接數過超負載。
3.建議搭建測試工具,對系統進行心跳檢查,對系統負載,連接數,處理數,處理耗時進行實時監(jiān)控報警。
對于nginx配置,這里提供官方文檔和一篇簡單配置介紹鏈接,希望有幫助: nginx.org/en/docs/,重點關注連接數配置,日志配置等。nginx的一些重要配置參考例子如下:
worker_processes 16; //CPU核數 error_log logs/error.log info; //錯誤日志log worker_rlimit_nofile 102400; //打開最大句柄數 events { worker_connections 102400; //允許最大連接數 } //請求日志記錄,關鍵字段:request_time-請求總時間,upstream_response_time后端處理時 間 log_format main '$remote_addr - $remote_user [$time_local] "$request" ' '$status $body_bytes_sent "$http_referer" ' '"$http_user_agent" "$http_x_forwarded_for" "$host" "$cookie_ssl_edition" ' '"$upstream_addr" "$upstream_status" "$request_time" ' '"$upstream_response_time" '; access_log logs/access.log main;
3.如何解決請求超時問題?
每個模塊都需要有完整的日志,能夠查出每個請求在每個模塊的耗時信息,配合微信報警提供信息,能夠很容易的定位到是哪個服務器出問題。常見的原因是:
1)機器負載太高,耗時增加
2)機器處理異常,消息丟失
3)機器異常,對于機器處理異常,建議盡快修復bug,對于機器異常,請盡快屏蔽有問題的機器。這里對機器負載太高,簡單提供可行的解決方案。方案一:優(yōu)化性能,擴容。檢查負載情況(cpu,內存,io,網絡,詳見附錄),根據具體性能瓶頸的不同,采取不同的優(yōu)化方式。方案二:異步處理。如果微信服務器推送的消息來不及實時處理,可將消息先存儲,先返回success給微信服務器,后臺可后續(xù)再處理消息,如果需要回復用戶消息,可通過調用客服消息接口API再回復用戶消息。
4.如何解決access_token存儲和使用問題?
經常有第三方反饋access_token造成服務中斷的問題,公眾平臺排查問題發(fā)現,大部分第三方都在瘋狂刷新access_token,使得access_token超出接口頻率限制而失效。 這里提供一個較為簡單的access_token 存儲和使用方案。
1)中控服務器定時(建議1小時)調用微信api,刷新access_token,將新的access_token 存入MySQL(或其他存儲),
2)其他工作服務器每次調用微信api時從mysql(或其他存儲)獲取access_token,并可在內存緩存一段時間(建議1分鐘)。
公眾平臺會保證在access_token刷新后,舊的access_token在5分鐘內仍能使用,以確保第三方在更新access_token時不會發(fā)生第三方調用微信api的失敗。
關于“微信開發(fā)之如何實現報警排查”這篇文章就分享到這里了,希望以上內容可以對大家有一定的幫助,使各位可以學到更多知識,如果覺得文章不錯,請把它分享出去讓更多的人看到。