偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

一個(gè)被自己坑的線上事故

開發(fā) 架構(gòu)
我們分析canal了異常日志后發(fā)現(xiàn),這個(gè)問題是由于canal訂閱者,讀取中文的表名時(shí),出現(xiàn)了亂碼,沒有成功讀取到。該程序直接拋了異常,導(dǎo)致canal訂閱者不能正常工作了。

前言

前段時(shí)間,我們線上系統(tǒng)出現(xiàn)了一個(gè)事故:用戶創(chuàng)建了商品,在商城的商品列表頁(yè)看不到,也搜索不到。、

這個(gè)問題持續(xù)了大概半個(gè)小時(shí),最后發(fā)現(xiàn)竟然是我的鍋。

這個(gè)事情怎么說(shuō)呢,完全是我自己把自己坑了。到底怎么回事呢?

1. 從需求說(shuō)起

1.1 背景

由于我們這個(gè)迭代是個(gè)大版本,上線的日子要臨近了。這次上線需要運(yùn)營(yíng)配合提供很多商品屬性的數(shù)據(jù),他們需要把第三方的屬性和我方系統(tǒng)的屬性,在excel表格中匹配起來(lái)。

原本是這樣規(guī)劃的:由運(yùn)營(yíng)同學(xué)在excel表格中手動(dòng)對(duì)應(yīng)雙方屬性的映射關(guān)系。

但后來(lái),他們覺得屬性太多了,如果他們?nèi)斯ぴ趀xcel表格中對(duì)應(yīng)屬性映射關(guān)系,可能時(shí)間上有點(diǎn)來(lái)不及。

于是,他們?cè)谀炒螘?huì)議上,特意給我提了需求,希望我可以通過程序幫他們?cè)趀xcel中,把雙方的屬性值映射上。

有一個(gè)要求就是要:快。

因?yàn)槠渌?,還要基于這份excel數(shù)據(jù),做一些后續(xù)處理。

1.2 原始需求

剛開始開會(huì)時(shí),運(yùn)營(yíng)說(shuō)的需求是:他們提供一個(gè)excel表格,里面有分類和屬性字段,然后讓我在程序中全匹配,把能夠匹配上的屬性編號(hào)和屬性,在excel的另外兩列中返回給他們。

然后,他們根據(jù)這份excel數(shù)據(jù),把匹配不上的(即另外兩列為空)數(shù)據(jù),在我們系統(tǒng)中手動(dòng)錄入,這樣最終都能匹配上。

1.3 加戲了

本來(lái)我覺得這個(gè)需求挺簡(jiǎn)單的。

但后來(lái),運(yùn)營(yíng)加戲了(加新需求)。

其實(shí),剛開始運(yùn)營(yíng)沒說(shuō)完。

后來(lái)發(fā)現(xiàn),他們要接入兩個(gè)廠商。

而且運(yùn)營(yíng)提供的兩個(gè)廠商的excel表格中字段的格式不一樣,沒法用一套程序搞定。

而且,我們發(fā)現(xiàn)有部分屬性中包含了一個(gè)區(qū)間范圍,跟我們系統(tǒng)的數(shù)據(jù)肯定是對(duì)應(yīng)不上的,必須要拆分屬性后再匹配。

很顯然,運(yùn)營(yíng)是不愿意做這種手動(dòng)拆分的工作的,這事他們想我?guī)退麄冇贸绦蛱幚恚@就給我增加了不少工作量。

此外,廠商1還有一個(gè)特殊需求:運(yùn)營(yíng)手動(dòng)把excel中的部分?jǐn)?shù)據(jù)剔除掉,然后基于這份新數(shù)據(jù)重新匹配一份新excel數(shù)據(jù)。

2. 最快的方案

了解運(yùn)營(yíng)的需求之后,我簡(jiǎn)單的分析了一下。按需求的優(yōu)先級(jí),排了一個(gè)順序:

  • 導(dǎo)出廠商1的屬性數(shù)據(jù)。
  • 導(dǎo)出廠商2的屬性數(shù)據(jù)。
  • 給廠商1導(dǎo)一份特殊的屬性數(shù)據(jù)。
  • 導(dǎo)出區(qū)間范圍能匹配上的數(shù)據(jù)。

如果這些需求都寫程序處理,可能要寫4個(gè)程序,而且還需要花時(shí)間部署代碼,我怕時(shí)間上來(lái)不及。

于是我想了一個(gè)快速處理需求1、2、3的辦法即:直接通過sql語(yǔ)句查詢出所需數(shù)據(jù)。

不過這套方案的前提是:需要把excel中的數(shù)據(jù)導(dǎo)入到生產(chǎn)環(huán)境中。

為了保險(xiǎn)起見,我先把excel中的數(shù)據(jù)導(dǎo)入dev環(huán)境中。等我寫好sql,測(cè)試好數(shù)據(jù)之后,再導(dǎo)入生產(chǎn)環(huán)境。

使用數(shù)據(jù)庫(kù)管理工具:Navicat Premium的Import Wizard功能,可以輕松將excel表格中的數(shù)據(jù)直接導(dǎo)入一張新表中。

它里面可以指定excel的sheet對(duì)于哪張表,指定excel中的列對(duì)應(yīng)表中哪些列。

由于這些需求都是新表,無(wú)需特別指定,我就按默認(rèn)的表名和字段名導(dǎo)入數(shù)據(jù)了。

但有個(gè)問題就是:表名和字段名都是中文的,因?yàn)閑xcel中的sheet名和sheet中的字段名都是中文的。

其實(shí),我當(dāng)時(shí)已經(jīng)發(fā)現(xiàn)了這個(gè)問題。

但當(dāng)時(shí)又想了想,表中字段比較多,要一一改成英文的,光起名字要花些時(shí)間。這些字段最終還是要轉(zhuǎn)換成運(yùn)營(yíng)可以看得懂的中文的字段名,這樣轉(zhuǎn)來(lái)轉(zhuǎn)去有點(diǎn)畫蛇添足,浪費(fèi)時(shí)間。

而且這張表導(dǎo)入生產(chǎn)環(huán)境之后,是一張臨時(shí)表,用完了就會(huì)被刪除的,影響不大。

此外,這張表是新加的,如果沒有程序使用的話,應(yīng)該是不會(huì)有問題的。

所以,當(dāng)時(shí)沒多想,就找人把數(shù)據(jù)導(dǎo)入生產(chǎn)環(huán)境了。

導(dǎo)出數(shù)據(jù)的方法很簡(jiǎn)單:

使用Navicat Premium的Dump SQL File中的Structure + Data即可。

這樣該數(shù)據(jù)庫(kù)工具,就會(huì)把相關(guān)表的建表的create語(yǔ)句,和插入數(shù)據(jù)的insert語(yǔ)句,導(dǎo)出到一個(gè).sql后綴的文件中。

有個(gè)小問題就是:每條數(shù)據(jù)會(huì)生成一個(gè)insert語(yǔ)句,如果太多了放到生成環(huán)境執(zhí)行,執(zhí)行效率會(huì)比較低。

這時(shí)可以將insert腳本復(fù)制到idea或者其他的工具中打開,然后全文替換一下,去掉多余的insert,拼接成一個(gè)insert語(yǔ)句。

然后再用在線的sql壓縮工具,比如:https://tool.lu/sql,壓縮一下去掉多余的空格。

這樣插入數(shù)據(jù)的sql放到生產(chǎn)環(huán)境執(zhí)行,效率要快很多。

運(yùn)營(yíng)提供的excel表格中的數(shù)據(jù),被導(dǎo)入生產(chǎn)環(huán)境之后。按計(jì)劃,通過一條sql語(yǔ)句,把運(yùn)營(yíng)所需要的結(jié)果直接查詢出來(lái),然后把結(jié)果復(fù)制到excel表格中。(注意:如果查詢結(jié)果的數(shù)據(jù)太多,不建議這么玩)。

按上面的做法,我很快完成了需求:1、2、3,并且把運(yùn)營(yíng)所需要的數(shù)據(jù)及時(shí)給他們了。

3. 一個(gè)插曲

原本按計(jì)劃,導(dǎo)完數(shù)據(jù)之后,生產(chǎn)環(huán)境中臨時(shí)表是要?jiǎng)h除的。

但出現(xiàn)了一個(gè)小插曲,運(yùn)營(yíng)給我提了一個(gè)臨時(shí)需求:需要重新導(dǎo)一份廠商2的數(shù)據(jù)給他們。

他們已經(jīng)按照表格中的內(nèi)容,把需要添加的屬性已經(jīng)添加到系統(tǒng)中了。需要我們重新導(dǎo)一份數(shù)據(jù),確認(rèn)一下,現(xiàn)在是否所有數(shù)據(jù)都能匹配上。

此時(shí),我當(dāng)時(shí)在慶幸幸好數(shù)據(jù)沒刪。

運(yùn)營(yíng)的這個(gè)臨時(shí)需求,在線上執(zhí)行相同的sql很快就把數(shù)據(jù)導(dǎo)出來(lái)了。

1分鐘實(shí)現(xiàn)需求,當(dāng)時(shí)那叫一個(gè):爽。

而且我觀察了一下,系統(tǒng)沒有出現(xiàn)異樣。

給運(yùn)營(yíng)把數(shù)據(jù)導(dǎo)完之后,我就忙其他事情去了,把刪除數(shù)據(jù)這個(gè)事情給忘了。

4. 線上出現(xiàn)問題

第二天上午,領(lǐng)導(dǎo)把我叫過去說(shuō):canal服務(wù)掛了。

我們分析canal了異常日志后發(fā)現(xiàn),這個(gè)問題是由于canal訂閱者,讀取中文的表名時(shí),出現(xiàn)了亂碼,沒有成功讀取到。該程序直接拋了異常,導(dǎo)致canal訂閱者不能正常工作了。

這個(gè)問題對(duì)用戶的影響是:用戶創(chuàng)建了商品,在商城的商品列表頁(yè)看不到,也搜索不到,有用戶投訴到運(yùn)營(yíng)那邊了。

我當(dāng)時(shí)的第一反應(yīng)是:這也能掛?

我當(dāng)時(shí)不知道下游的業(yè)務(wù)系統(tǒng),通過canal監(jiān)聽了我這邊的整個(gè)數(shù)據(jù)庫(kù)。

話不多說(shuō),先把問題解決了吧。

我們當(dāng)時(shí)為了快速解決問題,先把中文的臨時(shí)表都刪了,然后把canal重啟一下。

果然,這個(gè)辦法是有效的。

canal監(jiān)聽者立馬恢復(fù)正常了。

當(dāng)天,沒有再出現(xiàn)過問題。

第二天,領(lǐng)導(dǎo)把我叫過去說(shuō):canal服務(wù)又掛了。

我當(dāng)時(shí)一臉懵逼。我什么都沒干呀。

Canal解析數(shù)據(jù)報(bào)錯(cuò):column size is not match for table xxxx 8 vs 9。

后來(lái),我們經(jīng)過分析之后發(fā)現(xiàn),canal有一份緩存,如果canal出現(xiàn)異常,可能跟數(shù)據(jù)庫(kù)真實(shí)的情況不一致。

然后,我們把canal的meta.dat刪除了,然后重啟服務(wù),果然恢復(fù)正常了。

后面也一直沒出現(xiàn)過問題。

5. 確定需求4的方案

前面說(shuō)過運(yùn)營(yíng)總共提了4個(gè)需求,我通過前面的騷操作,完成了3個(gè)需求。

但第4個(gè)需求,里面還有點(diǎn)特殊要求,通過sql腳本不容易搞定,只能硬著頭皮寫java程序了。

運(yùn)營(yíng)的需求是把他們提供的excel表格中的數(shù)據(jù)導(dǎo)入系統(tǒng),然后由系統(tǒng)匹配某個(gè)區(qū)間范圍內(nèi)的數(shù)據(jù),把結(jié)果寫入excel的另外兩列中,最后返回該excel文件。

拿到這個(gè)需求我腦子里想了三個(gè)方案:

  • 寫一個(gè)可執(zhí)行的springboot工具項(xiàng)目,直接放到線上環(huán)境中執(zhí)行jar包。
  • 使用一個(gè)job處理,本身已經(jīng)有xxl-job了,接入非常方便。
  • 寫一個(gè)api接口。

最終我選擇了第3個(gè)方案。

為什么?

其實(shí)這3個(gè)方案代碼的工作量差不多,但前面兩個(gè)方案需要先上傳excel到應(yīng)用服務(wù)器,或者到OSS等文件服務(wù)器。

而如果運(yùn)營(yíng)需要導(dǎo)多次數(shù)據(jù),每次都需要上傳一次excel,不僅浪費(fèi)服務(wù)器資源,而且比較費(fèi)時(shí),還麻煩。

如果用api接口的話,可以直接使用postman遠(yuǎn)程調(diào)用,直接上傳文件,通過輸入流的形式讀取數(shù)據(jù),不保存到服務(wù)器。然后處理完數(shù)據(jù),在將excel內(nèi)容以輸出流的形式返回給我們下載即可。

使用postman調(diào)用遠(yuǎn)程接口時(shí),入?yún)⑦x擇form-data格式,key那里輸入File,然后在右側(cè)下拉列表中選擇File,就會(huì)出現(xiàn)Select Files按鈕。

通過該按鈕,就能選擇我們需要上傳的excel文件。

如果想調(diào)用接口后直接下載excel文件:

在postman中可以選擇Send and Download按鈕,即可下載文件。

注意,在圖片中的請(qǐng)求api接口地址是localhost,我只是舉了個(gè)例子,實(shí)際情況中是接口的域名。

此時(shí),有些小伙伴可能會(huì)問題:這個(gè)接口不需要登錄就能訪問?

答:確實(shí)不需要登錄,我在網(wǎng)關(guān)層放開了該接口的訪問權(quán)限。

那不是有安全問題?

答:為了解決接口安全問題,也避免發(fā)版影響正常用戶的使用。我的想法是基于master分支新拉一個(gè)分支:hotfix,而pre環(huán)境(預(yù)生產(chǎn)環(huán)境,能訪問生產(chǎn)環(huán)境的數(shù)據(jù)庫(kù))部署hotfix分支的代碼。

還有一個(gè)非常關(guān)鍵,而且我們一直在用的策略是:訪問pre的所有接口都必須使用指定的代理。

公司外面的人肯定是不知道這個(gè)代理的存在的,換句話說(shuō),只有我們公司內(nèi)部的人才能訪問pre環(huán)境的接口。

因此,新加的excel處理接口是非常安全的,而且該接口只部署pre環(huán)境,對(duì)正常用戶不會(huì)造成影響

這個(gè)方案看似挺完美的。

然后三下五除二,我把代碼寫完,本地測(cè)試通過了,準(zhǔn)備發(fā)到pre環(huán)境導(dǎo)數(shù)據(jù)。

6. jar包沖突

該功能部署pre環(huán)境其實(shí)非常簡(jiǎn)單,只需要部署hotfix分支的代碼即可。

代碼部署好之后,我準(zhǔn)備開始訪問接口。

先在postman的這個(gè)地方配置pre的代理。

代碼部署好之后,就能通過上一節(jié)中介紹的內(nèi)容上傳excel文件,然后下載結(jié)果excel文件了。

但我第一次調(diào)用接口時(shí),沒有返回想要的數(shù)據(jù)。從應(yīng)用服務(wù)器的日志中看到,該接口報(bào)錯(cuò)了。

報(bào)的竟然是某個(gè)類找不到。。。。

我這次為了快速導(dǎo)入和導(dǎo)出excel文件,選擇了阿里的easyexcel工具類。

本地開發(fā)環(huán)境,我確認(rèn)過,那個(gè)類是有的。而且我這個(gè)功能是可以正常運(yùn)行的,我都導(dǎo)出數(shù)據(jù)了。

但pre環(huán)境卻報(bào)了類找不到。

我猜可能是有jar包版本不兼容。

于是,調(diào)整了一下pom文件中引入的jar包的版本,之后,重新部署pre環(huán)境。

還真是這個(gè)原因,這一次接口能正常訪問,能夠返回?cái)?shù)據(jù)了。

我心里暗自竊喜。

后來(lái),把運(yùn)營(yíng)所需要的excel文件及時(shí)發(fā)給他們了。

7. pre環(huán)境網(wǎng)絡(luò)異常

又過了兩天,需求4有點(diǎn)調(diào)整。我把代碼改了,還是那個(gè)hotfix分支,找人重新部署了pre環(huán)境。

打算用之前相同的方法導(dǎo)數(shù)據(jù)的。

但馬上被啪啪打臉。

用postman請(qǐng)求該接口很久都不返回,我知道肯定是出了什么幺蛾子。

查了一下pre環(huán)境應(yīng)用服務(wù)器的日志,竟然沒有查到請(qǐng)求該數(shù)據(jù)處理接口的記錄。

接著,我查了一下pre環(huán)境應(yīng)用網(wǎng)關(guān)層的日志,竟然也沒有記錄。

不對(duì)呀。

然后又查了一下生產(chǎn)環(huán)境應(yīng)用網(wǎng)關(guān)層的日志,原來(lái)是請(qǐng)求到生產(chǎn)環(huán)境了。

不是配置了代理嗎?

為什么會(huì)訪問到生產(chǎn)環(huán)境?

我?guī)е@兩個(gè)問題咨詢了一下公司的IT部門同事。他們追查了一下原因,發(fā)現(xiàn)原來(lái)網(wǎng)絡(luò)帶寬被打滿,導(dǎo)致pre環(huán)境的代理出問題了。

經(jīng)過一段時(shí)間之后,pre環(huán)境的代理恢復(fù)正常了。

其實(shí),pre環(huán)境代理出問題后,我們也嘗試了一下登錄到遠(yuǎn)程服務(wù)器上,執(zhí)行相關(guān)curl命令,直接調(diào)用服務(wù)器的本地接口。最后,發(fā)現(xiàn)用這種方式不太好下載文件。

8. 部署錯(cuò)分支了

pre環(huán)境代理恢復(fù)之后,我滿懷希望去用postman請(qǐng)求數(shù)據(jù)處理接口導(dǎo)數(shù)據(jù)。

但我發(fā)現(xiàn)導(dǎo)出的數(shù)據(jù)不對(duì)。

導(dǎo)出的excel文件根本打不開。

我打開excel文件看數(shù)據(jù)內(nèi)容時(shí),提示excel文件格式不對(duì),或者已經(jīng)被損壞了。

然后,我趕緊看應(yīng)用服務(wù)器的日志,有請(qǐng)求記錄,但是沒有返回記錄,從這個(gè)日志中看不出問題。

當(dāng)時(shí)我靈機(jī)一動(dòng):既然保存成.xlsx后綴的excel文件打不開,如果把文件后綴改成.csv格式呢?

于是,我把導(dǎo)出的excel文件后綴改成了.csv格式,果然可以打開文件。

文件內(nèi)容中提示404。

這時(shí)我就明白了,可能是pre環(huán)境的接口沒發(fā)成功,被其他分支的代碼沖掉了。

然后,跟部署代碼的同學(xué)溝通之后,他當(dāng)時(shí)操作失誤,部署的master分支的代碼,果然把hotfix的代碼沖掉了。

后來(lái),他重新部署了hotfix的代碼,我順利的把數(shù)據(jù)導(dǎo)給運(yùn)營(yíng)了。

至此,這4個(gè)需求順利完成了。

總結(jié)

這次給運(yùn)營(yíng)導(dǎo)數(shù)據(jù),是一次比較難得的經(jīng)歷,遇到了很多問題,值得總結(jié)一下。

當(dāng)然這其中有一部分是自己給自己挖的坑,也有一部分是被其他人坑了。

不要怕踩坑,其實(shí)踩坑,也是成長(zhǎng)的機(jī)會(huì),我通過這次經(jīng)歷也收獲了不少寶貴的經(jīng)驗(yàn)。

生產(chǎn)環(huán)境的表名或字段名,一定不能用中文的。不要抱僥幸心里,說(shuō)不定哪天就出問題了。

生產(chǎn)環(huán)境創(chuàng)建的臨時(shí)表,用完之后,一定要記得及時(shí)清理。

使用canal時(shí),最好別全庫(kù)監(jiān)聽。用到什么表,就監(jiān)聽什么表,避免出現(xiàn)一些意外事故。

版本不兼容,會(huì)導(dǎo)致類找不到問題。

如果使用了代理,要考慮代理出現(xiàn)問題的情況。

代碼發(fā)版之后,一定要再三確認(rèn)分支是否正確。

刪除meta.dat文件,重新canal服務(wù),可以解決canal的很多問題。

postman真的非常強(qiáng)大,建議大家都好好用一下。

把多條insert語(yǔ)句合成一條執(zhí)行,效率更高。可以使用https://tool.lu/sql,這里在線工具,壓縮一下sql去掉多余的空格。

excel導(dǎo)入和導(dǎo)出用阿里的easyexcel工具,真的非常方便。

還有挺多收獲的,這里就不一一列舉了。

希望你看了我的文章,自己也會(huì)有點(diǎn)收獲,能從我的經(jīng)歷中,學(xué)到一點(diǎn)點(diǎn)東西,我就已經(jīng)心滿意足了。

責(zé)任編輯:武曉燕 來(lái)源: 蘇三說(shuō)技術(shù)
相關(guān)推薦

2022-12-08 09:34:26

開發(fā)操作

2025-04-08 00:22:00

C#異步編程

2020-10-28 15:07:01

Arthas

2024-08-20 21:27:04

docker部署容器

2020-05-07 11:00:24

Go亂碼框架

2021-11-05 07:59:25

HashMapJava知識(shí)總結(jié)

2023-01-16 14:49:00

MongoDB數(shù)據(jù)庫(kù)

2020-11-16 12:35:25

線程池Java代碼

2022-06-06 11:31:31

MySQL數(shù)據(jù)查詢

2022-07-11 13:58:14

數(shù)據(jù)庫(kù)業(yè)務(wù)流程系統(tǒng)

2021-11-26 08:33:51

React組件前端

2020-09-22 08:06:45

代碼事故

2021-01-13 09:14:00

緩存穿透RPC

2023-02-16 08:55:13

2018-12-29 08:15:28

Tomcat應(yīng)用部署

2023-11-09 09:02:26

TypeScriptas const

2022-09-07 09:09:13

高并發(fā)架構(gòu)

2022-05-26 08:12:52

debugSpringFeign

2021-05-11 09:42:04

CI校驗(yàn)前端git config

2013-06-28 17:28:04

推送
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)