您當(dāng)前的位置是:  首頁(yè) > 資訊 > 文章精選 >
 首頁(yè) > 資訊 > 文章精選 >

微軟云自主醫(yī)療保健手冊(cè)

2020-03-17 13:18:47   作者:   來(lái)源:   評(píng)論:0  點(diǎn)擊:


  今天我們給大家說(shuō)說(shuō)Azure上的MySQL的健康保健相關(guān)的話(huà)題,不帶推銷(xiāo)保健品,大家可以放心食用。
  數(shù)據(jù)庫(kù)是所有應(yīng)用中最不可或缺的一個(gè)組件,所有有狀態(tài)的數(shù)據(jù)都需要依托數(shù)據(jù)庫(kù)提供的格式,規(guī)范進(jìn)行存儲(chǔ)、讀取、改寫(xiě)等。那么既然是一個(gè)炙手可熱的角色,如何讓系統(tǒng)能夠快速有效的和數(shù)據(jù)庫(kù)進(jìn)行溝通,就是一個(gè)比較有意思的話(huà)題了。如果把這個(gè)內(nèi)容全部展開(kāi),可能會(huì)涉及到數(shù)據(jù)庫(kù)的冗余性,擴(kuò)展性設(shè)計(jì)等一系列的問(wèn)題,這次我們就先把目標(biāo)鎖定在如何快速管理連接這個(gè)點(diǎn)上。
  如果把各個(gè)應(yīng)用比作是需要看病就醫(yī)的病患,那么醫(yī)院可以說(shuō)是一個(gè)大的數(shù)據(jù)庫(kù)。那如何看病就醫(yī),井然有序,就需要一個(gè)規(guī)章法度,比如病人是否有此地就醫(yī)的資格,是否已經(jīng)掛號(hào),有否既往病史,還需要什么化驗(yàn)等。那么同樣,應(yīng)用如果要得到數(shù)據(jù)庫(kù)的增刪改查的權(quán)限也一定要有一個(gè)流程。簡(jiǎn)要來(lái)說(shuō),流程就是通過(guò)一些網(wǎng)絡(luò)協(xié)議,握手連接到數(shù)據(jù)庫(kù),提供一個(gè)有效的連接字符串,隨后數(shù)據(jù)庫(kù)會(huì)對(duì)比此應(yīng)用是否有資格來(lái)訪問(wèn)這個(gè)數(shù)據(jù)庫(kù),最后就能愉快的增刪改查了。
  接下來(lái)我們將以Azure上面的MySQL PaaS為例,給大家講解一些簡(jiǎn)單的數(shù)據(jù)庫(kù)連接的使用場(chǎng)景,以及最佳實(shí)踐。
  01、第一種場(chǎng)景:
  單個(gè)進(jìn)程連接,非頻繁訪問(wèn)
  我們假設(shè)一個(gè)病人只是有點(diǎn)小的頭疼腦熱,那么第一次就診結(jié)束,配了點(diǎn)藥,然后可能需要第二天去復(fù)診。這個(gè)時(shí)候也許他還得要走一次掛號(hào),查醫(yī)保信息,配藥看醫(yī)生等一系列流程。所以并不能直接敲開(kāi)醫(yī)生診室的門(mén),說(shuō)我想直接看病配藥。那么同樣的道理,我們到數(shù)據(jù)庫(kù)的連接中,會(huì)有一個(gè)超時(shí)(timeout)的概念,也就是說(shuō)我第一次增刪改查完,也許我等待了60秒,再一次查詢(xún),發(fā)現(xiàn)數(shù)據(jù)庫(kù)說(shuō)對(duì)不起,請(qǐng)重新連接“掛號(hào)”因?yàn)闀r(shí)間太長(zhǎng)了,我不認(rèn)識(shí)你了,或者說(shuō)你的狀態(tài)我不知道了,請(qǐng)重新握手協(xié)議,連接字符串,身份驗(yàn)證走一遍。那么我們看圖示,里面哪些是我們需要一個(gè)數(shù)據(jù)庫(kù)連接要提供的信息呢。
  1.數(shù)據(jù)庫(kù)的連接字符串,這個(gè)可以在Azure上得到你的程序需要的連接字符串。需要注意的是Azure上的數(shù)據(jù)庫(kù)用戶(hù)名比較特殊,在@后面會(huì)帶上服務(wù)器名,這個(gè)和本地自建的不太一樣。
  2.隨后我們用Python的程序新建一個(gè)表格,并且插入一些數(shù)據(jù),模擬一個(gè)單進(jìn)程的非頻繁訪問(wèn)。
  3.那么現(xiàn)在我們加入一個(gè)延時(shí)60秒,看看會(huì)發(fā)生什么?

  4.為什么之前連接執(zhí)行語(yǔ)句都好好的,怎們就加了60秒的等待就歇菜了呢?別著急,我們?cè)贏zure MySQL的參數(shù)調(diào)整里看一下wait_timeout的值,你會(huì)發(fā)現(xiàn),咦,怎么有一個(gè)值是30秒呢?原來(lái)超過(guò)了30秒這個(gè)時(shí)間,原來(lái)的連接就超時(shí)了,我們程序里寫(xiě)得是休眠60秒。就需要重新連接,重新掛號(hào)了。
  那么你會(huì)發(fā)現(xiàn)一旦程序有了空閑時(shí)間段,數(shù)據(jù)庫(kù)就會(huì)不繼續(xù)等待了,直接用timeout這個(gè)參數(shù)把你的連接給掐斷了,需要你從頭再來(lái)。這個(gè)很好理解,比如你在昨天看了醫(yī)生,醫(yī)生也不可能一直記得你,也不可能一直等你,只有到了你再去的時(shí)候,重新掛號(hào)然后再和白衣天使一起討論病情。那么你有可能會(huì)問(wèn),那么如果是比較復(fù)雜的病情,一會(huì)要拍個(gè)片,一會(huì)要驗(yàn)血,其中都需要等待時(shí)間,那么拿了報(bào)告,醫(yī)生又讓我掛號(hào),驗(yàn)證身份,豈不是很煩?那有沒(méi)有一個(gè)比較人性化的制度可以讓這些頻繁的檢查能夠管理起來(lái),那么我們就來(lái)看第二個(gè)場(chǎng)景。
  02、第二個(gè)場(chǎng)景:
  單個(gè)進(jìn)程,需要頻繁交互的數(shù)據(jù)庫(kù)
  之前我們討論那種需要等化驗(yàn)結(jié)果,多次詢(xún)問(wèn)醫(yī)生的場(chǎng)景。那么映射到數(shù)據(jù)庫(kù),就是說(shuō)單個(gè)進(jìn)程,需要頻繁的訪問(wèn)數(shù)據(jù)庫(kù)。這個(gè)其實(shí)有兩個(gè)思路可以解決,第一種是把timeout的參數(shù)調(diào)的大一點(diǎn)其實(shí)就好了。這個(gè)沒(méi)錯(cuò),但是也存在一定安全和資源浪費(fèi),比如這個(gè)長(zhǎng)連接會(huì)不會(huì)被非法占用,寶貴的數(shù)據(jù)庫(kù)連接數(shù)是不是會(huì)被長(zhǎng)時(shí)間占用,這些都是問(wèn)題。那么第二個(gè)思路是,由一個(gè)中間人來(lái)協(xié)調(diào)所有的連接,同時(shí)讓這些連接不會(huì)超時(shí),同時(shí)也可以免去某一個(gè)進(jìn)程需要頻繁交互,頻繁驗(yàn)證握手等,給程序帶了很多等待時(shí)間。那么這種中間人的技術(shù)就叫做連接池,它的作用就相當(dāng)于一共有10個(gè)醫(yī)生坐班,連接池就是一個(gè)醫(yī)導(dǎo)(可以是人,也可以是醫(yī)院的信息化系統(tǒng)),事先都和這些醫(yī)生很熟,建立了信任的連接,那么病患只要和這個(gè)醫(yī)導(dǎo)建立連接,掛號(hào)驗(yàn)證身份,就能做完各種化驗(yàn),繼續(xù)找醫(yī)生看病,省卻了很多流程上的時(shí)間。那么再數(shù)據(jù)庫(kù)的技術(shù)上有很多這些連接池的技術(shù),比如DBUtils,PySQLpool等再python上使用比較頻繁的模塊。這次我們就以DBUtils來(lái)給大家講解一下。
  1.先看一下大概的概念,對(duì)比一下醫(yī)導(dǎo)和連接池的類(lèi)似概念。如圖上顯示的連接池在第一次驗(yàn)證之后,把所有的連接都放在它的大池子里,應(yīng)用端不用每次都走一遍繁瑣的流程,如果要在一個(gè)交易或者業(yè)務(wù)邏輯里頻繁增刪改查幾十次,那么完全可以省下來(lái)之前這么多步驟,應(yīng)用速度大大提升。
  2.那么接下來(lái), 用DBUtils來(lái)建立一個(gè)9個(gè)連接的連接池,數(shù)據(jù)庫(kù)timeout參數(shù)還是30s不變,然后我們同樣休眠60s,發(fā)現(xiàn)繼續(xù)使用conn1還是可以連接,說(shuō)明數(shù)據(jù)庫(kù)連接池并沒(méi)有釋放掉原來(lái)的連接,而是緩存在了連接池之中。連接池一直保持這和數(shù)據(jù)庫(kù)的硬連接,這個(gè)“硬”連接是真正走過(guò)所有的握手協(xié)議身份驗(yàn)證的,而應(yīng)用和連接池的連接則是軟連接是放在一個(gè)緩存池中里的。當(dāng)然你還能定義有多少硬連接是在連接池建立完之后一直保留著的,這樣會(huì)對(duì)突發(fā)的軟連接有一定的幫助。
  3.一旦設(shè)置了連接池,就比較完美解決了單進(jìn)程的頻繁訪問(wèn)問(wèn)題了。那么你可能會(huì)問(wèn),如果是多進(jìn)程怎么處理呢?連接池可以完美解決這個(gè)問(wèn)題嗎?接下來(lái)我們來(lái)看看下一個(gè)場(chǎng)景。
  03、第三種場(chǎng)景:
  多進(jìn)程訪問(wèn)數(shù)據(jù)庫(kù)
  一般在顯示問(wèn)題里,資源都是比較緊俏的。資源不緊俏說(shuō)的好聽(tīng)是冗余度高,防范黑天鵝,說(shuō)的不好聽(tīng)就是浪費(fèi),但是這個(gè)平衡點(diǎn)確實(shí)很難掌握。那么我們現(xiàn)在討論的場(chǎng)景就是資源相當(dāng)緊俏的數(shù)據(jù)庫(kù)連接,要被很多進(jìn)程頻繁同時(shí)訪問(wèn)。比如現(xiàn)在是流行病高發(fā)時(shí)期,醫(yī)院看呼吸道疾病的醫(yī)生可能只有10個(gè)人,但是同時(shí)要看病的患者可能成百上千,那么怎么樣才能讓這些心急火燎的病患能夠看病治療呢?那么醫(yī)導(dǎo)這個(gè)系統(tǒng)可以記住所有來(lái)訪的病人,知道哪些可以先去做血液檢查,哪些在這個(gè)空隙,可以找醫(yī)生看片子,那么10個(gè)醫(yī)生的效率得到了最有話(huà)。只需要醫(yī)導(dǎo)系統(tǒng)與這10個(gè)醫(yī)生連接,所有的病人信息都緩存在醫(yī)導(dǎo)這里;而不需要病人直接和醫(yī)生建立連接,那么效率就是等10個(gè)病人全部檢查完畢,才能看接下來(lái)的病人,效率會(huì)十分的緩慢。
  1.現(xiàn)在我們先看一下, 如果不做任何共享連接的方式。也就是說(shuō)到了連接上限就掐斷,所有應(yīng)用被勸離。
  2.先看一下目前Azure MySQL的設(shè)置的連接數(shù)上限是10(當(dāng)然這個(gè)不是最大值,最大連接數(shù)隨著你選擇的實(shí)例大小而變化)
  3.初始化連接池的時(shí)候,不選共享連接, 參數(shù)上Blocking放成False。啟動(dòng)20個(gè)并發(fā)的線程
  4.沒(méi)有共享等待連接機(jī)制的情況下,超出連接數(shù)的線程就報(bào)錯(cuò)了。
  5.那么現(xiàn)在我們把等待緩存機(jī)制換上,那么并發(fā)來(lái)的線程就能夠等待之前的線程釋放資源后,繼續(xù)使用有限的連接數(shù)。這樣就達(dá)到了一個(gè)緩存池的作用。同樣的道理,如果我們醫(yī)生醫(yī)院不夠大的時(shí)候,就可以建立很多簡(jiǎn)易或者野外的醫(yī)院,隔離病房等,讓看病的病患先得到妥善安置,然后在按需就醫(yī)。
  6.現(xiàn)在我們把緩存機(jī)制打開(kāi),把Blocking參數(shù)置成True。發(fā)現(xiàn)即使有20個(gè)進(jìn)程同時(shí)并發(fā),也會(huì)通過(guò)連接池緩存技術(shù),妥善把所有進(jìn)程完成,達(dá)到共享10個(gè)連接數(shù)的可能性。
  場(chǎng)景總結(jié)
  最后我們來(lái)總結(jié)一下前面三個(gè)場(chǎng)景。第一個(gè)場(chǎng)景是單進(jìn)程非頻繁訪問(wèn),所以每一次訪問(wèn)都需要做一次數(shù)據(jù)庫(kù)連接,會(huì)消耗一定資源和數(shù)據(jù)庫(kù)連接數(shù)量。那么第二個(gè)場(chǎng)景是單進(jìn)程,但是頻繁訪問(wèn),引入了數(shù)據(jù)庫(kù)連接池的概念,可以事先維護(hù)好一定數(shù)量的連接池,不用每次訪問(wèn)都去建立一次連接,那么頻繁訪問(wèn)的速度得到了保證。第三種場(chǎng)景的問(wèn)題是如果是多進(jìn)程的訪問(wèn)情況,連接數(shù)量會(huì)不夠,這個(gè)時(shí)候引入了連接池緩存等待機(jī)制,就很好的解決了高并發(fā)多進(jìn)程的問(wèn)題。所以在什么場(chǎng)景下選擇什么樣的技術(shù)方案是至關(guān)重要的。
  要解決數(shù)據(jù)庫(kù)連接或者看病難這種緊缺資源的問(wèn)題,需要用到一些中間調(diào)劑人或者系統(tǒng),那么這個(gè)系統(tǒng)是用公平的輪詢(xún)機(jī)制,隨機(jī)數(shù)機(jī)制,還是帶有權(quán)重的機(jī)制,就涉及到資源分配的大問(wèn)題了。設(shè)計(jì)系統(tǒng)的時(shí)候一定要把這些因素考慮進(jìn)去,那么愿天下系統(tǒng)安穩(wěn),一切苦厄消散。
  最后,提供本文技術(shù)參考指南及MySQL 連接池代碼供各位查閱:
  DBUtils 用戶(hù)指南:
  https://cito.github.io/DBUtils/UsersGuide.html#id2
  代碼傳送門(mén):
  https://github.com/jurejoy/MySQLconnectionpool


 
【免責(zé)聲明】本文僅代表作者本人觀點(diǎn),與CTI論壇無(wú)關(guān)。CTI論壇對(duì)文中陳述、觀點(diǎn)判斷保持中立,不對(duì)所包含內(nèi)容的準(zhǔn)確性、可靠性或完整性提供任何明示或暗示的保證。請(qǐng)讀者僅作參考,并請(qǐng)自行承擔(dān)全部責(zé)任。

評(píng)論排行

專(zhuān)題

CTI論壇會(huì)員企業(yè)