微信公眾平臺(tái)已對(duì)外開放接口報(bào)警,當(dāng)微信服務(wù)器向開發(fā)者推送消息失敗次數(shù)達(dá)到預(yù)定閾值時(shí),會(huì)將報(bào)警消息發(fā)送到指定微信報(bào)警群中(設(shè)置方式:公眾平臺(tái)->開發(fā)-運(yùn)維中心->接口報(bào)警),請(qǐng)開發(fā)者積極主動(dòng)關(guān)注報(bào)警,即時(shí)解決故障,提高微信公眾號(hào)的服務(wù)質(zhì)量。
為了更好地根據(jù)報(bào)警信息尾部的實(shí)例(提供了openid及時(shí)間戳stamp)進(jìn)行問(wèn)題排查,開發(fā)者需要在接入層、邏輯層等每一個(gè)層級(jí)都加上包含關(guān)鍵信息的詳細(xì)日志,以利于快速定位問(wèn)題。
報(bào)警目前有2類:
1.通用報(bào)警,所有開發(fā)者都需要關(guān)注。
類型 | 描述 |
---|---|
DNS失敗 | 微信服務(wù)器向公眾號(hào)推送消息或事件時(shí),解析DNS失敗 |
DNS超時(shí) | 微信服務(wù)器向公眾號(hào)推送消息或事件時(shí),解析DNS超時(shí),超時(shí)時(shí)間為5秒 |
連接超時(shí) | 微信服務(wù)器連接公眾號(hào)開發(fā)者服務(wù)器時(shí)發(fā)生超時(shí),超時(shí)時(shí)間為5秒 |
請(qǐng)求超時(shí) | 微信服務(wù)器向公眾號(hào)推送消息或事件后,開發(fā)者5秒內(nèi)沒(méi)有返回 |
回應(yīng)失敗 | 微信服務(wù)器向公眾號(hào)推送消息或事件后,得到的回應(yīng)不合法 |
MarkFail(自動(dòng)屏蔽) | 微信服務(wù)器向公眾號(hào)推送消息或事件發(fā)生多次失敗后,暫時(shí)不推送消息,一分鐘后解除屏蔽 |
2.公眾號(hào)第三方平臺(tái)報(bào)警,只有在微信開放平臺(tái)(open.weixin.qq.com)上申請(qǐng)成為公眾號(hào)第三方平臺(tái)的開發(fā)者,才需要關(guān)注此報(bào)警。
類型 | 描述 |
---|---|
推送component_verify_ticket超時(shí) | 推送component_verify_ticket時(shí),開發(fā)者5S內(nèi)沒(méi)有返回 |
推送component_verify_ticket失敗 | 推送component_verify_ticket時(shí),開發(fā)者沒(méi)有返回success |
推送第三方平臺(tái)消息超時(shí) | 推送第三方平臺(tái)消息(如取消授權(quán)消息)等,第三方平臺(tái)5秒內(nèi)沒(méi)有返回 |
推送第三方平臺(tái)消息失敗 | 推送第三方平臺(tái)消息(如取消授權(quán)消息)等,第三方平臺(tái)沒(méi)有返回success |
下面對(duì)具體的報(bào)警做示例以及排查指引說(shuō)明。
報(bào)警內(nèi)容描述:
a)appid:公眾號(hào)appid b)昵稱: 公眾號(hào)昵稱 c)時(shí)間:所有報(bào)警,都會(huì)提供首次發(fā)生異常的時(shí)間。(如首次發(fā)生超時(shí)的時(shí)間,首次發(fā)生回應(yīng)失敗的時(shí)間) d)內(nèi)容:錯(cuò)誤的具體描述 e)次數(shù):發(fā)生失敗的次數(shù) f)錯(cuò)誤樣例:錯(cuò)誤樣例里注明了一些幫助查找問(wèn)題的信息。如:首次超時(shí)開發(fā)者的IP和推送消息類型。如果是回應(yīng)失敗,錯(cuò)誤樣例還會(huì)注明首次回應(yīng)失敗時(shí)開發(fā)者的回包。
一般情況下,通過(guò)報(bào)警提供的IP,時(shí)間,消息類型,能夠比較快速的定位到第三方發(fā)生問(wèn)題的原因。
報(bào)警示例1:超時(shí)報(bào)警
Appid: wxxxxxx 昵稱: WxNickName 時(shí)間: 2014-12-01 20:12:00 內(nèi)容: 微信服務(wù)器向公眾號(hào)推送消息或事件后,開發(fā)者5秒內(nèi)沒(méi)有返回 次數(shù): 5分鐘 1272次 錯(cuò)誤樣例: [IP=203.205.140.29][Event=UnSubscribe]
該報(bào)警表示:微信服務(wù)器向開發(fā)者推送取消關(guān)注事件時(shí),開發(fā)者沒(méi)有在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ù)器向公眾號(hào)推送消息或事件后,得到的回應(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)容長(zhǎng)度為10個(gè)字節(jié),內(nèi)容為“Error 500:”。
報(bào)警示例3:連接超時(shí)
Appid: wxxxx 昵稱: WxNickName 時(shí)間: 2015-02-04 20:13:09 內(nèi)容: 微信服務(wù)器連接公眾號(hào)開發(fā)者服務(wù)器時(shí)發(fā)生超時(shí),超時(shí)時(shí)間為5秒 次數(shù): 5分鐘 7289次 錯(cuò)誤樣例: [IP=180.150.190.135][Msg=Text]
該報(bào)警表示:微信服務(wù)器向開發(fā)者推送粉絲發(fā)來(lái)的文本消息時(shí),無(wú)法連接到開發(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,事件類型是用戶推送的消息。
1.DNS失敗
該錯(cuò)誤為微信服務(wù)器在推送消息給開發(fā)者時(shí),解析dns失敗。如遇到此報(bào)警,請(qǐng)開發(fā)者確認(rèn):
a)填寫的url,域名是否有誤; b) 域名是否發(fā)生變化,如過(guò)期,更新等。
如果不是以上2個(gè)問(wèn)題,請(qǐng)聯(lián)系微信公眾平臺(tái)。
2.Dns超時(shí)
目前不會(huì)有此錯(cuò)誤。
3.連接超時(shí)
該錯(cuò)誤是微信服務(wù)器和開發(fā)者服務(wù)器3S內(nèi)未連接成功。報(bào)警消息會(huì)提供出首次發(fā)生連接失敗的時(shí)間和連接的IP。如遇此報(bào)警,請(qǐng)開發(fā)者確認(rèn):
a)該IP是否有誤。 b)該IP機(jī)器是否過(guò)載,連接過(guò)多。 c)如果是第三方提供服務(wù)器托管,托管商是否有故障。 d)網(wǎng)絡(luò)運(yùn)營(yíng)商是否有故障。
4.請(qǐng)求超時(shí)
微信服務(wù)器向開發(fā)者服務(wù)器推送消息或事件,開發(fā)者5秒內(nèi)沒(méi)有返回。請(qǐng)求超時(shí)時(shí),報(bào)警消息會(huì)提供第一次出現(xiàn)請(qǐng)求超時(shí)的時(shí)間,開發(fā)者IP和消息類型。請(qǐng)開發(fā)者確認(rèn):
a)該IP是否有誤 b)該IP是否接收到報(bào)警消息給出的該消息類型的請(qǐng)求 c)該請(qǐng)求是否處理時(shí)間過(guò)長(zhǎng)
5.回應(yīng)失敗
開發(fā)者沒(méi)有按照wiki中的回復(fù)消息格式進(jìn)行回復(fù)消息,或者發(fā)生網(wǎng)絡(luò)錯(cuò)誤,會(huì)報(bào)警回應(yīng)失敗,報(bào)警消息會(huì)提供第一次出現(xiàn)請(qǐng)求回應(yīng)失敗的時(shí)間,開發(fā)者的IP,消息類型以及回應(yīng)的消息內(nèi)容,請(qǐng)開發(fā)者確認(rèn):
a)該IP是否有誤 b)該IP是否發(fā)生網(wǎng)絡(luò)錯(cuò)誤 c)該業(yè)務(wù)處理邏輯是否沒(méi)有按照wiki規(guī)范回復(fù)消息,或是進(jìn)入了異常邏輯。
6.MarkFail(自動(dòng)屏蔽)
微信后臺(tái)會(huì)實(shí)時(shí)統(tǒng)計(jì)開發(fā)者的失敗次數(shù)。在推送消息給開發(fā)者發(fā)生大量失敗時(shí),微信服務(wù)器會(huì)自動(dòng)屏蔽開發(fā)者,1分鐘內(nèi)不再推送任何消息,并會(huì)發(fā)送報(bào)警到微信群。此報(bào)警是級(jí)別最高的報(bào)警,開發(fā)者在收到此報(bào)警時(shí)請(qǐng)盡快處理后臺(tái)故障,恢復(fù)服務(wù)。事實(shí)上,開發(fā)者在收到此報(bào)警前,必然會(huì)收到連接超時(shí),請(qǐng)求超時(shí)或回應(yīng)失敗等報(bào)警,需要開發(fā)者即時(shí)去解決這些故障,避免被微信服務(wù)器屏蔽,嚴(yán)重影響公眾號(hào)服務(wù)!
7.推送component_verify_ticket超時(shí) & 8.推送component_verify_ticket失敗 & 9.推送組件消息超時(shí) & 10.推送組件消息失敗
以上4個(gè)報(bào)警只有公眾號(hào)第三方平臺(tái)開發(fā)者會(huì)收到,其他公眾號(hào)開發(fā)者無(wú)需關(guān)注。由于公眾號(hào)第三方平臺(tái)承載了更多的公眾號(hào),所以公眾號(hào)第三方平臺(tái)的服務(wù)質(zhì)量需要更嚴(yán)格要求和報(bào)警,所以把這4個(gè)特殊的事件單獨(dú)報(bào)警。具體的問(wèn)題查找方式與4,5是一樣的,這里不在贅述。關(guān)于公眾號(hào)第三方平臺(tái)的具體申請(qǐng)與開發(fā)實(shí)現(xiàn),請(qǐng)前往微信開放平臺(tái)(open.weixin.qq.com)
1.如何排查DNS失敗的問(wèn)題?
1.Ping測(cè)試你們MP上配置的url里的域名,確認(rèn)是否能夠得到正確的IP。如不能得到或者錯(cuò)誤,請(qǐng)到你們的域名托管商管理系統(tǒng)上檢查配置。 2.如1能夠得到正確的IP,又有DNS失敗的報(bào)警;請(qǐng)使用DNS服務(wù)器182.254.116.116 來(lái)再測(cè)試驗(yàn)證。Linux : dig @182.254.116.116 域名;windows 修改網(wǎng)絡(luò)配置里的DNS服務(wù)器地址,然后再ping 域名。如果得到的IP不正確或者得不到,請(qǐng)聯(lián)系微信團(tuán)隊(duì)。
2.如何解決連接超時(shí)問(wèn)題?
1.查看是否網(wǎng)絡(luò)環(huán)境問(wèn)題。 (1)使用公眾平臺(tái)接口,獲取到微信回調(diào)服務(wù)器的IP,https://api.weixin.qq.com/cgi-bin/getcallbackip?access_token=ACCESS_TOKEN, (2)在你們的服務(wù)上ping 測(cè)試,檢查你們服務(wù)器到微信回調(diào)用服務(wù)器的網(wǎng)絡(luò)質(zhì)量情況。如有網(wǎng)絡(luò)問(wèn)題,請(qǐng)聯(lián)系你們的服務(wù)器提供商解決。 2.查看接入層服務(wù)器連接數(shù),負(fù)載,nginx的配置,允許的連接個(gè)數(shù)。查看nginx錯(cuò)誤日志是否有“Connection reset by peer”或“Connection timed out”錯(cuò)誤日志,如有說(shuō)明nginx連接數(shù)過(guò)超負(fù)載。 3.建議搭建測(cè)試工具,對(duì)系統(tǒng)進(jìn)行心跳檢查,對(duì)系統(tǒng)負(fù)載,連接數(shù),處理數(shù),處理耗時(shí)進(jìn)行實(shí)時(shí)監(jiān)控報(bào)警。 對(duì)于nginx配置,這里提供官方文檔和一篇簡(jiǎn)單配置介紹鏈接,希望有幫助: 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ù) } //請(qǐng)求日志記錄,關(guān)鍵字段:request_time-請(qǐng)求總時(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.如何解決請(qǐng)求超時(shí)問(wèn)題?
每個(gè)模塊都需要有完整的日志,能夠查出每個(gè)請(qǐng)求在每個(gè)模塊的耗時(shí)信息,配合微信報(bào)警提供信息,能夠很容易的定位到是哪個(gè)服務(wù)器出問(wèn)題。常見(jiàn)的原因是:
1)機(jī)器負(fù)載太高,耗時(shí)增加 2)機(jī)器處理異常,消息丟失 3)機(jī)器異常,對(duì)于機(jī)器處理異常,建議盡快修復(fù)bug,對(duì)于機(jī)器異常,請(qǐng)盡快屏蔽有問(wèn)題的機(jī)器。這里對(duì)機(jī)器負(fù)載太高,簡(jiǎn)單提供可行的解決方案。方案一:優(yōu)化性能,擴(kuò)容。檢查負(fù)載情況(cpu,內(nèi)存,io,網(wǎng)絡(luò),詳見(jiàn)附錄),根據(jù)具體性能瓶頸的不同,采取不同的優(yōu)化方式。方案二:異步處理。如果微信服務(wù)器推送的消息來(lái)不及實(shí)時(shí)處理,可將消息先存儲(chǔ),先返回success給微信服務(wù)器,后臺(tái)可后續(xù)再處理消息,如果需要回復(fù)用戶消息,可通過(guò)調(diào)用客服消息接口API再回復(fù)用戶消息。
4.如何解決access_token存儲(chǔ)和使用問(wèn)題?
經(jīng)常有第三方反饋access_token造成服務(wù)中斷的問(wèn)題,公眾平臺(tái)排查問(wèn)題發(fā)現(xiàn),大部分第三方都在瘋狂刷新access_token,使得access_token超出接口頻率限制而失效。 這里提供一個(gè)較為簡(jiǎn)單的access_token 存儲(chǔ)和使用方案。
1)中控服務(wù)器定時(shí)(建議1小時(shí))調(diào)用微信api,刷新access_token,將新的access_token 存入mysql(或其他存儲(chǔ)), 2)其他工作服務(wù)器每次調(diào)用微信api時(shí)從mysql(或其他存儲(chǔ))獲取access_token,并可在內(nèi)存緩存一段時(shí)間(建議1分鐘)。
公眾平臺(tái)會(huì)保證在access_token刷新后,舊的access_token在5分鐘內(nèi)仍能使用,以確保第三方在更新access_token時(shí)不會(huì)發(fā)生第三方調(diào)用微信api的失敗。
詳情請(qǐng)見(jiàn):微信推送消息與事件說(shuō)明
下面對(duì)查看服務(wù)器性能負(fù)載的常用工具做簡(jiǎn)單介紹,詳細(xì)的工具使用請(qǐng)另行查閱。
1、查看CPU的性能負(fù)載
a)uptime
用于觀察服務(wù)器整體負(fù)載,系統(tǒng)負(fù)載指運(yùn)行隊(duì)列(1分鐘、5分鐘、15分鐘前)的平均長(zhǎng)度, 正常情況需要小于cpu個(gè)數(shù)。
b)vmstat
vmstat是Virtual Meomory Statistics(虛擬內(nèi)存統(tǒng)計(jì))的縮寫,可對(duì)操作系統(tǒng)的虛擬內(nèi)存、進(jìn)程、CPU活動(dòng)進(jìn)行監(jiān)控。他是對(duì)系統(tǒng)的整體情況進(jìn)行統(tǒng)計(jì),通常使用vmstat 5 5(表示每隔5秒生成一次數(shù)據(jù),生成五次)命令測(cè)試。將得到一個(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是控制臺(tái)命令,是一個(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)活動(dòng)情況報(bào)告)是目前 Linux 上最為全面的系統(tǒng)性能分析工具之一,可以從多方面對(duì)系統(tǒng)的活動(dòng)進(jìn)行報(bào)告,包括:文件的讀寫情況、系統(tǒng)調(diào)用的使用情況、磁盤I/O、CPU效率、內(nèi)存使用狀況、進(jìn)程活動(dòng)及IPC有關(guān)的活動(dòng)等。本文主要以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ì)信息。
nginx問(wèn)題的排查方法
當(dāng)出現(xiàn)直接超時(shí)、處理返回慢時(shí)的報(bào)警時(shí),nigix側(cè)的故障排查參考方法有如下: 1、檢查請(qǐng)求日志情況, tail -f logs/access.log ,看upstream_status字段。
200:表示正常; 502/503/504:表示處理慢,或者后端down機(jī);再看upstream_response_time返回的時(shí)間是否真的較慢,有沒(méi)有上百毫秒,或更高的,有則說(shuō)明是后端服務(wù)有問(wèn)題。 404:表示請(qǐng)求的路徑不存在或不對(duì),文件不在了。需要檢查你配置在公眾平臺(tái)上的url路徑是否正確; 服務(wù)器上的文件、程序是否存在。 403:表示無(wú)權(quán)限訪問(wèn)。 檢查一下nginx.conf 是否有特殊的訪問(wèn)配置。 499: 則是客戶端的問(wèn)題,請(qǐng)聯(lián)系微信團(tuán)隊(duì)。 此錯(cuò)誤少見(jiàn)。
2、檢查錯(cuò)誤日志情況,tail -f logs/error_log ,查看是否有connect() failed、Connection refused、 Connection reset by peer等error錯(cuò)誤日志,有則說(shuō)明有可能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 //無(wú)連接是活動(dòng)的或正在進(jìn)行 LISTEN //服務(wù)器在等待進(jìn)入呼叫 SYN_RECV //一個(gè)連接請(qǐng)求已經(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)用說(shuō)它已經(jīng)完成 FIN_WAIT2 //另一邊已同意釋放 ITMED_WAIT //等待所有分組死掉 CLOSING //兩邊同時(shí)嘗試關(guān)閉 TIME_WAIT //另一邊已初始化一個(gè)釋放 LAST_ACK //等待所有分組死掉 (2)查看系統(tǒng)的句柄配置情況,ulimit -n ,確認(rèn)是否過(guò)小(小于請(qǐng)求數(shù)) (3)worker_rlimit_nofile、worker_connections配置項(xiàng),是否過(guò)?。ㄐ∮谡?qǐng)求數(shù))
更多建議: