微信平臺開發(fā) 報(bào)警排查指引

2019-03-14 11:40 更新

報(bào)警排查指引


概要說明


微信公眾平臺已對外開放接口報(bào)警,當(dāng)微信服務(wù)器向開發(fā)者推送消息失敗次數(shù)達(dá)到預(yù)定閾值時(shí),會將報(bào)警消息發(fā)送到指定微信報(bào)警群中(設(shè)置方式:公眾平臺->開發(fā)-運(yùn)維中心->接口報(bào)警),請開發(fā)者積極主動關(guān)注報(bào)警,即時(shí)解決故障,提高微信公眾號的服務(wù)質(zhì)量。

為了更好地根據(jù)報(bào)警信息尾部的實(shí)例(提供了openid及時(shí)間戳stamp)進(jìn)行問題排查,開發(fā)者需要在接入層、邏輯層等每一個(gè)層級都加上包含關(guān)鍵信息的詳細(xì)日志,以利于快速定位問題。

報(bào)警目前有2類:

1.通用報(bào)警,所有開發(fā)者都需要關(guān)注。

類型描述
DNS失敗微信服務(wù)器向公眾號推送消息或事件時(shí),解析DNS失敗
DNS超時(shí)微信服務(wù)器向公眾號推送消息或事件時(shí),解析DNS超時(shí),超時(shí)時(shí)間為5秒
連接超時(shí)微信服務(wù)器連接公眾號開發(fā)者服務(wù)器時(shí)發(fā)生超時(shí),超時(shí)時(shí)間為5秒
請求超時(shí)微信服務(wù)器向公眾號推送消息或事件后,開發(fā)者5秒內(nèi)沒有返回
回應(yīng)失敗微信服務(wù)器向公眾號推送消息或事件后,得到的回應(yīng)不合法
MarkFail(自動屏蔽)微信服務(wù)器向公眾號推送消息或事件發(fā)生多次失敗后,暫時(shí)不推送消息,一分鐘后解除屏蔽

2.公眾號第三方平臺報(bào)警,只有在微信開放平臺(open.weixin.qq.com)上申請成為公眾號第三方平臺的開發(fā)者,才需要關(guān)注此報(bào)警。

類型描述
推送component_verify_ticket超時(shí)推送component_verify_ticket時(shí),開發(fā)者5S內(nèi)沒有返回
推送component_verify_ticket失敗推送component_verify_ticket時(shí),開發(fā)者沒有返回success
推送第三方平臺消息超時(shí)推送第三方平臺消息(如取消授權(quán)消息)等,第三方平臺5秒內(nèi)沒有返回
推送第三方平臺消息失敗推送第三方平臺消息(如取消授權(quán)消息)等,第三方平臺沒有返回success

下面對具體的報(bào)警做示例以及排查指引說明。

報(bào)警內(nèi)容說明

報(bào)警內(nèi)容描述:

a)appid:公眾號appid
b)昵稱: 公眾號昵稱
c)時(shí)間:所有報(bào)警,都會提供首次發(fā)生異常的時(shí)間。(如首次發(fā)生超時(shí)的時(shí)間,首次發(fā)生回應(yīng)失敗的時(shí)間)
d)內(nèi)容:錯(cuò)誤的具體描述
e)次數(shù):發(fā)生失敗的次數(shù)
f)錯(cuò)誤樣例:錯(cuò)誤樣例里注明了一些幫助查找問題的信息。如:首次超時(shí)開發(fā)者的IP和推送消息類型。如果是回應(yīng)失敗,錯(cuò)誤樣例還會注明首次回應(yīng)失敗時(shí)開發(fā)者的回包。

一般情況下,通過報(bào)警提供的IP,時(shí)間,消息類型,能夠比較快速的定位到第三方發(fā)生問題的原因。

報(bào)警示例1:超時(shí)報(bào)警

Appid: wxxxxxx
昵稱: WxNickName
時(shí)間: 2014-12-01 20:12:00
內(nèi)容: 微信服務(wù)器向公眾號推送消息或事件后,開發(fā)者5秒內(nèi)沒有返回
次數(shù): 5分鐘 1272次
錯(cuò)誤樣例: [IP=203.205.140.29][Event=UnSubscribe]

該報(bào)警表示:微信服務(wù)器向開發(fā)者推送取消關(guān)注事件時(shí),開發(fā)者沒有在5秒內(nèi)返回結(jié)果。在2014-12-01 20:12:00-2014-12-01 20:17:00這5分鐘內(nèi)發(fā)生了1272次。其中這5分鐘內(nèi)第一次發(fā)生超時(shí)的時(shí)間是:2014-12-01 20:12:00, 開發(fā)者的IP是:203.205.140.29,事件類型是取消關(guān)注事件。

報(bào)警示例2:回應(yīng)失敗

Appid: wxxxx
昵稱: WxNickName
時(shí)間: 2014-12-01 20:12:00
內(nèi)容: 微信服務(wù)器向公眾號推送消息或事件后,得到的回應(yīng)不合法
次數(shù): 5分鐘 1320次
錯(cuò)誤樣例: [Event=Click] [ip=58.248.9.218][response_length=10][response_content=Error 500:]

該報(bào)警表示:微信服務(wù)器向開發(fā)者推送自定義菜單點(diǎn)擊事件時(shí),開發(fā)者的返回結(jié)果不合法。在2014-12-01 20:12:00-2014-12-01 20:17:00這5分鐘內(nèi)發(fā)生了1320次。其中這5分鐘內(nèi)第一次發(fā)生回應(yīng)失敗的時(shí)間是:2014-12-01 20:12:00, 開發(fā)者的IP是:58.248.9.218,事件類型是點(diǎn)擊菜單事件,第三方返回的內(nèi)容長度為10個(gè)字節(jié),內(nèi)容為“Error 500:”。

報(bào)警示例3:連接超時(shí)

Appid: wxxxx
昵稱: WxNickName
時(shí)間: 2015-02-04 20:13:09
內(nèi)容: 微信服務(wù)器連接公眾號開發(fā)者服務(wù)器時(shí)發(fā)生超時(shí),超時(shí)時(shí)間為5秒
次數(shù): 5分鐘 7289次
錯(cuò)誤樣例: [IP=180.150.190.135][Msg=Text]

該報(bào)警表示:微信服務(wù)器向開發(fā)者推送粉絲發(fā)來的文本消息時(shí),無法連接到開發(fā)者填寫的服務(wù)器地址。在2015-02-04 20:13:09-2015-02-04 20:18:00這5分鐘內(nèi)發(fā)生了7289次,這5分鐘內(nèi)第一次發(fā)生連接超時(shí)的時(shí)間是:2015-02-04 20:13:09, 開發(fā)者的IP是:180.150.190.135,事件類型是用戶推送的消息。

各類報(bào)警的排查方法

1.DNS失敗

該錯(cuò)誤為微信服務(wù)器在推送消息給開發(fā)者時(shí),解析dns失敗。如遇到此報(bào)警,請開發(fā)者確認(rèn):

a)填寫的url,域名是否有誤;
b) 域名是否發(fā)生變化,如過期,更新等。

如果不是以上2個(gè)問題,請聯(lián)系微信公眾平臺。

2.Dns超時(shí)

目前不會有此錯(cuò)誤。

3.連接超時(shí)

該錯(cuò)誤是微信服務(wù)器和開發(fā)者服務(wù)器3S內(nèi)未連接成功。報(bào)警消息會提供出首次發(fā)生連接失敗的時(shí)間和連接的IP。如遇此報(bào)警,請開發(fā)者確認(rèn):

a)該IP是否有誤。
b)該IP機(jī)器是否過載,連接過多。
c)如果是第三方提供服務(wù)器托管,托管商是否有故障。
d)網(wǎng)絡(luò)運(yùn)營商是否有故障。

4.請求超時(shí)

微信服務(wù)器向開發(fā)者服務(wù)器推送消息或事件,開發(fā)者5秒內(nèi)沒有返回。請求超時(shí)時(shí),報(bào)警消息會提供第一次出現(xiàn)請求超時(shí)的時(shí)間,開發(fā)者IP和消息類型。請開發(fā)者確認(rèn):

a)該IP是否有誤
b)該IP是否接收到報(bào)警消息給出的該消息類型的請求
c)該請求是否處理時(shí)間過長

5.回應(yīng)失敗

開發(fā)者沒有按照wiki中的回復(fù)消息格式進(jìn)行回復(fù)消息,或者發(fā)生網(wǎng)絡(luò)錯(cuò)誤,會報(bào)警回應(yīng)失敗,報(bào)警消息會提供第一次出現(xiàn)請求回應(yīng)失敗的時(shí)間,開發(fā)者的IP,消息類型以及回應(yīng)的消息內(nèi)容,請開發(fā)者確認(rèn):

a)該IP是否有誤
b)該IP是否發(fā)生網(wǎng)絡(luò)錯(cuò)誤
c)該業(yè)務(wù)處理邏輯是否沒有按照wiki規(guī)范回復(fù)消息,或是進(jìn)入了異常邏輯。

6.MarkFail(自動屏蔽)

微信后臺會實(shí)時(shí)統(tǒng)計(jì)開發(fā)者的失敗次數(shù)。在推送消息給開發(fā)者發(fā)生大量失敗時(shí),微信服務(wù)器會自動屏蔽開發(fā)者,1分鐘內(nèi)不再推送任何消息,并會發(fā)送報(bào)警到微信群。此報(bào)警是級別最高的報(bào)警,開發(fā)者在收到此報(bào)警時(shí)請盡快處理后臺故障,恢復(fù)服務(wù)。事實(shí)上,開發(fā)者在收到此報(bào)警前,必然會收到連接超時(shí),請求超時(shí)或回應(yīng)失敗等報(bào)警,需要開發(fā)者即時(shí)去解決這些故障,避免被微信服務(wù)器屏蔽,嚴(yán)重影響公眾號服務(wù)!

7.推送component_verify_ticket超時(shí) & 8.推送component_verify_ticket失敗 & 9.推送組件消息超時(shí) & 10.推送組件消息失敗

以上4個(gè)報(bào)警只有公眾號第三方平臺開發(fā)者會收到,其他公眾號開發(fā)者無需關(guān)注。由于公眾號第三方平臺承載了更多的公眾號,所以公眾號第三方平臺的服務(wù)質(zhì)量需要更嚴(yán)格要求和報(bào)警,所以把這4個(gè)特殊的事件單獨(dú)報(bào)警。具體的問題查找方式與4,5是一樣的,這里不在贅述。關(guān)于公眾號第三方平臺的具體申請與開發(fā)實(shí)現(xiàn),請前往微信開放平臺(open.weixin.qq.com)

常見問題

1.如何排查DNS失敗的問題?

1.Ping測試你們MP上配置的url里的域名,確認(rèn)是否能夠得到正確的IP。如不能得到或者錯(cuò)誤,請到你們的域名托管商管理系統(tǒng)上檢查配置。
2.如1能夠得到正確的IP,又有DNS失敗的報(bào)警;請使用DNS服務(wù)器182.254.116.116             來再測試驗(yàn)證。Linux :   dig @182.254.116.116 域名;windows 修改網(wǎng)絡(luò)配置里的DNS服務(wù)器地址,然后再ping 域名。如果得到的IP不正確或者得不到,請聯(lián)系微信團(tuán)隊(duì)。

2.如何解決連接超時(shí)問題?

1.查看是否網(wǎng)絡(luò)環(huán)境問題。
   (1)使用公眾平臺接口,獲取到微信回調(diào)服務(wù)器的IP,https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN,
   (2)在你們的服務(wù)上ping 測試,檢查你們服務(wù)器到微信回調(diào)用服務(wù)器的網(wǎng)絡(luò)質(zhì)量情況。如有網(wǎng)絡(luò)問題,請聯(lián)系你們的服務(wù)器提供商解決。
2.查看接入層服務(wù)器連接數(shù),負(fù)載,nginx的配置,允許的連接個(gè)數(shù)。查看nginx錯(cuò)誤日志是否有“Connection reset by peer”或“Connection timed out”錯(cuò)誤日志,如有說明nginx連接數(shù)過超負(fù)載。
3.建議搭建測試工具,對系統(tǒng)進(jìn)行心跳檢查,對系統(tǒng)負(fù)載,連接數(shù),處理數(shù),處理耗時(shí)進(jìn)行實(shí)時(shí)監(jiān)控報(bào)警。
對于nginx配置,這里提供官方文檔和一篇簡單配置介紹鏈接,希望有幫助: http://nginx.org/en/docs/,重點(diǎn)關(guān)注連接數(shù)配置,日志配置等。nginx的一些重要配置參考例子如下:
worker_processes  16;          //CPU核數(shù)
error_log  logs/error.log  info;   //錯(cuò)誤日志log
worker_rlimit_nofile 102400;     //打開最大句柄數(shù)
events {
    worker_connections  102400;   //允許最大連接數(shù)
}
//請求日志記錄,關(guān)鍵字段:request_time-請求總時(shí)間,upstream_response_time后端處理時(shí) 間
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.如何解決請求超時(shí)問題?

每個(gè)模塊都需要有完整的日志,能夠查出每個(gè)請求在每個(gè)模塊的耗時(shí)信息,配合微信報(bào)警提供信息,能夠很容易的定位到是哪個(gè)服務(wù)器出問題。常見的原因是:

1)機(jī)器負(fù)載太高,耗時(shí)增加
2)機(jī)器處理異常,消息丟失
3)機(jī)器異常,對于機(jī)器處理異常,建議盡快修復(fù)bug,對于機(jī)器異常,請盡快屏蔽有問題的機(jī)器。這里對機(jī)器負(fù)載太高,簡單提供可行的解決方案。方案一:優(yōu)化性能,擴(kuò)容。檢查負(fù)載情況(cpu,內(nèi)存,io,網(wǎng)絡(luò),詳見附錄),根據(jù)具體性能瓶頸的不同,采取不同的優(yōu)化方式。方案二:異步處理。如果微信服務(wù)器推送的消息來不及實(shí)時(shí)處理,可將消息先存儲,先返回success給微信服務(wù)器,后臺可后續(xù)再處理消息,如果需要回復(fù)用戶消息,可通過調(diào)用客服消息接口API再回復(fù)用戶消息。

4.如何解決access_token存儲和使用問題?

經(jīng)常有第三方反饋access_token造成服務(wù)中斷的問題,公眾平臺排查問題發(fā)現(xiàn),大部分第三方都在瘋狂刷新access_token,使得access_token超出接口頻率限制而失效。 這里提供一個(gè)較為簡單的access_token 存儲和使用方案。

1)中控服務(wù)器定時(shí)(建議1小時(shí))調(diào)用微信api,刷新access_token,將新的access_token 存入mysql(或其他存儲),
2)其他工作服務(wù)器每次調(diào)用微信api時(shí)從mysql(或其他存儲)獲取access_token,并可在內(nèi)存緩存一段時(shí)間(建議1分鐘)。

公眾平臺會保證在access_token刷新后,舊的access_token在5分鐘內(nèi)仍能使用,以確保第三方在更新access_token時(shí)不會發(fā)生第三方調(diào)用微信api的失敗。

附錄

附錄1:微信推送的消息事件列表和響應(yīng)格式

詳情請見:微信推送消息與事件說明

附錄2:查看服務(wù)器性能負(fù)載的常用工具

下面對查看服務(wù)器性能負(fù)載的常用工具做簡單介紹,詳細(xì)的工具使用請另行查閱。

1、查看CPU的性能負(fù)載

a)uptime

用于觀察服務(wù)器整體負(fù)載,系統(tǒng)負(fù)載指運(yùn)行隊(duì)列(1分鐘、5分鐘、15分鐘前)的平均長度, 正常情況需要小于cpu個(gè)數(shù)。

b)vmstat

vmstat是Virtual Meomory Statistics(虛擬內(nèi)存統(tǒng)計(jì))的縮寫,可對操作系統(tǒng)的虛擬內(nèi)存、進(jìn)程、CPU活動進(jìn)行監(jiān)控。他是對系統(tǒng)的整體情況進(jìn)行統(tǒng)計(jì),通常使用vmstat 5 5(表示每隔5秒生成一次數(shù)據(jù),生成五次)命令測試。將得到一個(gè)數(shù)據(jù)匯總他能夠反映真正的系統(tǒng)情況。

c)top top命令是最流行Unix/Linux的性能工具之一。系統(tǒng)管理員可用運(yùn)行top命令監(jiān)視進(jìn)程和Linux整體性能。

2、查看內(nèi)存的性能負(fù)載

a)free

Linux下的free命令,可以用于查看當(dāng)前系統(tǒng)內(nèi)存的使用情況,它顯示系統(tǒng)中剩余及已用的物理內(nèi)存和交換內(nèi)存,以及共享內(nèi)存和被核心使用的緩沖區(qū)。

3、查看網(wǎng)絡(luò)的性能負(fù)載

b)netstat

Netstat是控制臺命令,是一個(gè)監(jiān)控TCP/IP網(wǎng)絡(luò)的非常有用的工具,它可以顯示路由表、實(shí)際的網(wǎng)絡(luò)連接以及每一個(gè)網(wǎng)絡(luò)接口設(shè)備的狀態(tài)信息。Netstat用于顯示與IP、TCP、UDP和ICMP協(xié)議相關(guān)的統(tǒng)計(jì)數(shù)據(jù),一般用于檢驗(yàn)本機(jī)各端口的網(wǎng)絡(luò)連接情況。

c)sar

sar(System Activity Reporter系統(tǒng)活動情況報(bào)告)是目前 Linux 上最為全面的系統(tǒng)性能分析工具之一,可以從多方面對系統(tǒng)的活動進(jìn)行報(bào)告,包括:文件的讀寫情況、系統(tǒng)調(diào)用的使用情況、磁盤I/O、CPU效率、內(nèi)存使用狀況、進(jìn)程活動及IPC有關(guān)的活動等。本文主要以CentOS 6.3 x64系統(tǒng)為例,介紹sar命令。

4、查看磁盤的性能負(fù)載

a)iostat

Linux下的iostat命令,可用于報(bào)告中央處理器(CPU)統(tǒng)計(jì)信息和整個(gè)系統(tǒng)、適配器、tty 設(shè)備、磁盤和 CD-ROM 的輸入/輸出統(tǒng)計(jì)信息。

附錄3:nginx配置和排查指引

nginx問題的排查方法

當(dāng)出現(xiàn)直接超時(shí)、處理返回慢時(shí)的報(bào)警時(shí),nigix側(cè)的故障排查參考方法有如下: 1、檢查請求日志情況, tail -f logs/access.log ,看upstream_status字段。

   200:表示正常;
   502/503/504:表示處理慢,或者后端down機(jī);再看upstream_response_time返回的時(shí)間是否真的較慢,有沒有上百毫秒,或更高的,有則說明是后端服務(wù)有問題。
   404:表示請求的路徑不存在或不對,文件不在了。需要檢查你配置在公眾平臺上的url路徑是否正確; 服務(wù)器上的文件、程序是否存在。
   403:表示無權(quán)限訪問。 檢查一下nginx.conf 是否有特殊的訪問配置。
   499: 則是客戶端的問題,請聯(lián)系微信團(tuán)隊(duì)。  此錯(cuò)誤少見。

2、檢查錯(cuò)誤日志情況,tail -f logs/error_log ,查看是否有connect() failed、Connection refused、 Connection reset by peer等error錯(cuò)誤日志,有則說明有可能nginx出現(xiàn)的連接數(shù)超負(fù)載等情況。

   (1)查看系統(tǒng)的網(wǎng)絡(luò)連接數(shù)情況確認(rèn)是否有較大的鏈接數(shù)
    # netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}' 
    解析: 
	   CLOSED //無連接是活動的或正在進(jìn)行 
	   LISTEN //服務(wù)器在等待進(jìn)入呼叫 
	   SYN_RECV //一個(gè)連接請求已經(jīng)到達(dá),等待確認(rèn) 
 	   SYN_SENT //應(yīng)用已經(jīng)開始,打開一個(gè)連接 
	   ESTABLISHED //正常數(shù)據(jù)傳輸狀態(tài)/當(dāng)前并發(fā)連接數(shù)  
	   FIN_WAIT1 //應(yīng)用說它已經(jīng)完成  
	   FIN_WAIT2 //另一邊已同意釋放  
	   ITMED_WAIT //等待所有分組死掉 
	   CLOSING //兩邊同時(shí)嘗試關(guān)閉 
	   TIME_WAIT //另一邊已初始化一個(gè)釋放 
	   LAST_ACK //等待所有分組死掉
	   
   (2)查看系統(tǒng)的句柄配置情況,ulimit -n ,確認(rèn)是否過小(小于請求數(shù))
   (3)worker_rlimit_nofile、worker_connections配置項(xiàng),是否過小(小于請求數(shù))

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號