Python和SQL Server 2017的力量
Python是SQL Server 2017的新功能。
它主要是為了允許在SQL Server中使用基于Python的機器學(xué)習(xí),但是它可以與任何Python庫或框架一起使用。為了提供可能的例子,Hitendra展示了如何安全地使用該功能來提供智能應(yīng)用程序緩存,其中SQL Server可以自動指示數(shù)據(jù)何時更改以觸發(fā)緩存刷新。
MS SQL Server 2017已經(jīng)通過啟用SQL服務(wù)器通過“使用Python的機器學(xué)習(xí)服務(wù)”在TSQL中執(zhí)行Python腳本,添加到其高級分析擴展,現(xiàn)在稱為“機器學(xué)習(xí)服務(wù)”。這基本上提供了一種數(shù)據(jù)庫程序員可以直接從Python傳遞數(shù)據(jù)的方法。這樣做的有用性不僅限于為數(shù)據(jù)分析提供機器學(xué)習(xí)功能,因為Python具有許多易于使用的模塊和框架來解決許多問題,例如使用數(shù)據(jù)結(jié)構(gòu)執(zhí)行大量計算工作,用于分析的圖形處理,網(wǎng)絡(luò)操作,數(shù)據(jù)庫操作,網(wǎng)絡(luò)操作或基于本地/網(wǎng)絡(luò)的文件系統(tǒng)操作。顯然,其中許多在中間件方面做得最好,但在數(shù)據(jù)庫系統(tǒng)中,有時候,直接與外部系統(tǒng)通信更方便,而不是依靠外部進程來輪詢數(shù)據(jù)源來執(zhí)行任務(wù)。這沒有問題的如果在數(shù)據(jù)庫或數(shù)據(jù)層中有一個這樣的解決方案,并且不提供任何安全性問題時。
在這里,我們將嘗試演示在Advanced Analytics Extension中使用Python的示例,顯示數(shù)據(jù)庫如何觸發(fā)外部進程來對作為參數(shù)提供的數(shù)據(jù)執(zhí)行活動。這是為了考慮安全性,數(shù)據(jù)可靠性和事務(wù)響應(yīng)時間的問題。?
?
Python的用例
通過從SQL調(diào)用Python腳本而不是依賴于中間件,可以更容易地完成某些任務(wù)。特別是在數(shù)據(jù)庫中事件發(fā)起任務(wù)的情況下。任務(wù)可能包括:
通過TCP / HTTP / SOAP向網(wǎng)絡(luò)系統(tǒng)發(fā)送數(shù)據(jù)或從基于網(wǎng)絡(luò)的系統(tǒng)接收數(shù)據(jù)。
利用本地平臺資源,如文件系統(tǒng),網(wǎng)絡(luò)或GPU。
通過使用通用數(shù)據(jù)格式(如JSON,XML或YAML)構(gòu)建一個或多個系統(tǒng)之間的實時集成。
通過與外部應(yīng)用程序通信生成數(shù)據(jù)或文件。
當(dāng)然,很少有潛在的缺點
如果您使用Python需要互聯(lián)網(wǎng)訪問,那么存在必須保持安全的數(shù)據(jù)可能會被意外地通過互聯(lián)網(wǎng)共享的風(fēng)險。任何互聯(lián)網(wǎng)訪問必須由網(wǎng)絡(luò)仔細(xì)監(jiān)管。
允許通過“啟用外部腳本執(zhí)行”在服務(wù)器上執(zhí)行Python腳本來暴露安全風(fēng)險。
相同服務(wù)器上的資源密集型Python腳本可能會影響大型OLTP系統(tǒng)上正在進行的事務(wù)的性能。
衡量這些優(yōu)點和缺點,似乎有時候Python可以發(fā)揮有用的作用,如果可以最小化風(fēng)險。作為一個例子,讓我們考慮一下我們?nèi)绾问褂肞ython構(gòu)建數(shù)據(jù)緩存系統(tǒng)供應(yīng)用層使用。
?
緩存示例解決方案
緩存數(shù)據(jù)可以提高應(yīng)用程序的性能。以緩存的存儲開銷為代價,當(dāng)遇到與數(shù)據(jù)庫的聊天網(wǎng)絡(luò)通信以及數(shù)據(jù)庫面臨重復(fù)查詢時資源消耗高的情況下,我們可以獲得有用的性能提升。當(dāng)我們構(gòu)建緩存基礎(chǔ)架構(gòu)時,我們面臨著什么時候刷新緩存的內(nèi)容的常見問題。我們傾向于在一定時間間隔之后采用重建緩存的簡單解決方案。然而,這是非常低效的。當(dāng)數(shù)據(jù)更改時刷新緩存更好,只刷新改變的內(nèi)容。在創(chuàng)建,更新或刪除數(shù)據(jù)時,我們可以實時接近實時。有很多工具和框架可用于解決刷新問題,但是他們遇到如何確定數(shù)據(jù)發(fā)生了什么變化以及何時發(fā)生變化的問題。數(shù)據(jù)庫是最好的所有能夠做到這一點。
對于我們這里提供的緩存系統(tǒng),我們將把自己限制在微軟堆棧中,以防止Python本身。
Microsoft SQL Server 2017(CPT)
??? 服務(wù)代理隔離事務(wù)數(shù)據(jù)庫
?Python執(zhí)行腳本,可以通過HTTP更新緩存(Python 3.5可執(zhí)行文件與Anaconda發(fā)行版中的庫)
Net 4.5.2
??? ????????ASP.Net MVC為我們的示例Web UI
? ? ? ? ? ? ASP.Net WebAPI封裝緩存存儲為我們的示例解決方案。
以下是我們的示例解決方案緩存系統(tǒng)的圖示:
?
所述WebApplication的提供用戶接口來讀取和更新數(shù)據(jù)。
我們示例緩存存儲解決方案中的RESTful.Cache應(yīng)用程序是使用ASP.Net WebAPI2構(gòu)建的,其內(nèi)容類型為JSON。HTTP-GET操作從本地緩存(靜態(tài)集合)傳送數(shù)據(jù)。
MS SQL Server 2017(CPT)是一個數(shù)據(jù)庫服務(wù)器
TransDB?OLTP數(shù)據(jù)庫,處理事務(wù)繁忙。
Cacher執(zhí)行Python腳本執(zhí)行的代理數(shù)據(jù)庫,啟用了啟用“外部腳本啟用”選項的腳本執(zhí)行。請參閱?Microsoft.Doc:啟用外部腳本的服務(wù)器配置選項。
Service Broker是SQL服務(wù)器的可靠消息傳遞框架,有助于橋接?Cacher?-Agent和?TransDB??梢蕴幚?Cacher?-Agent接收的消息來更新緩存。
Python是使用SQL 2017(CPT)的數(shù)據(jù)庫系統(tǒng)的集成腳本語言。
解決方案的架構(gòu)
在我們的解決方案中,我們將在RESTful.Cache應(yīng)用程序中緩存實體“?產(chǎn)品類型名稱”,并且WebApplication將具有創(chuàng)建新產(chǎn)品類型條目并從RESTful.Cache讀取的功能。
條件
除此之外,還有一些先決條件和一些我們需要考慮的信息。
SQL實例,其中CacheDB托管必須有“麻與Python茅根學(xué)習(xí)服務(wù)”安裝
要在CacheDB中使用TSQL執(zhí)行Python腳本,應(yīng)運行SQL Service?MSSQLLaunchpad或SQL Server Launchpad。請參閱Microsoft.Net:Microsoft機器學(xué)習(xí)服務(wù)
使用SP_Configure啟用外部腳本執(zhí)行,請參閱Microsoft.Doc:啟用外部腳本的服務(wù)器配置選項
| sp_configure 'external scripts enabled', 1; ??RECONFIGURE; |
該TransDB和cacher的托管環(huán)境應(yīng)該有它的實例創(chuàng)建Service Broker端點,如果這是在兩個不同的SQL實例獨立托管那么每個實例都應(yīng)該有自己的端點。
該TransDB和cacher的數(shù)據(jù)庫應(yīng)該啟用代理。請參閱Microsoft.Technet:如何:激活數(shù)據(jù)庫中的Service Broker消息傳遞
?
| ALTER DATABASE TransDB SET ENABLE_BROKER; ??GO ??ALTER DATABASE CacheDB SET ENABLE_BROKER; ??GO |
.NET應(yīng)用程序
該WebApplication的有兩個主要的MVC行動;?一個使用HTTP動詞POST?更新TransDB中的一個新實體,另一個使用HTTP動詞GET從緩存返回產(chǎn)品類型列表的操作。
?
RESTful.Cache有兩種操作方法,一種是使用HTTP動詞POST?更新新添加的實體產(chǎn)品類型的緩存,另一種用于從本地緩存獲取所有緩存的產(chǎn)品類型。
?
對于我們的示例解決方案,這兩個應(yīng)用程序都在IIS中托管在各個應(yīng)用程序池標(biāo)識下,以保護應(yīng)用程序安全?但是對于實際的系統(tǒng)實現(xiàn),托管環(huán)境可以是內(nèi)部網(wǎng)或互聯(lián)網(wǎng)環(huán)境中的單個Web服務(wù)器。
?
該RESTful.Cache授權(quán)規(guī)則只有兩個服務(wù)帳戶來處理HTTP請求,即
?
abc \ WebApp_SVC和abc \ CacherAgent_SVC。abc \ CacherAgent_SVC服務(wù)帳戶允許SQL中的Python腳本通過HTTP到達應(yīng)用程序來刷新緩存。
abc \ WebApp_SVC用戶用于具有授權(quán)規(guī)則模式的WebApplication,以允許訪問RESTful.Cache應(yīng)用程序。
SQL數(shù)據(jù)庫和服務(wù)代理
OLTP數(shù)據(jù)庫TransDB有幾個對象,包括表,存儲過程和Service Broker對象。
?
為了我們的目的,UpdateProductType過程使用新記錄更新ProductType表,AcknowledgeProductTypeCache過程是CacheIntegration隊列的激活過程,當(dāng)處理消息時即從Cacher數(shù)據(jù)庫接收來自目標(biāo)的確認(rèn)。它還處理異常,如果有的話,并將其記錄在CacheIntegrationError表中。
有關(guān)Service Broker的更多信息,請訪問Microsoft.DOC:SQL Server Service Broker
?
對于我們的示例解決方案,TransDB是創(chuàng)建新的ProductType記錄時創(chuàng)建更新緩存消息的源數(shù)據(jù)庫,執(zhí)行操作的消息,它具有UpdateMessage消息類型,CacheIntegration合同將CacheSource服務(wù)發(fā)送到目標(biāo)數(shù)據(jù)庫。該服務(wù)具有CacheQueue,由Service Broker組件用于執(zhí)行可靠的消息傳遞。該ToCacheTarget路由具有信息傳遞消息到它的目標(biāo)。
為了消除任何增加事務(wù)處理時間的機會以及避免事務(wù)數(shù)據(jù)庫中其余數(shù)據(jù)的任何安全風(fēng)險,我們將通過使用我們的示例解決方案中名為Cacher數(shù)據(jù)庫的代理數(shù)據(jù)庫來解除緩存更新過程。Service Broker消息傳遞基礎(chǔ)設(shè)施將有助于連接TransDB和Cacher數(shù)據(jù)庫,基于事件的消息處理將使我們能夠更新駐留在基于網(wǎng)絡(luò)的系統(tǒng)上的緩存存儲。該cacher的數(shù)據(jù)庫是打在訂單的最新消息到達時進行緩存刷新代理的角色。它通過執(zhí)行Python腳本更新緩存。
?
?
Cacher數(shù)據(jù)庫具有:
CacheLog和CacheIntegration錯誤表,以跟蹤緩存何時被刷新,并且具有在緩存刷新過程中可能發(fā)生的任何錯誤的記錄。
所述PerformCacheUpdate過程從接收傳入消息TransDB通過服務(wù)代理。如果消息的類型是UpdateMessage,那么它將執(zhí)行另一個過程UpdateWebCache,執(zhí)行Python腳本執(zhí)行。
該UpdateWebCache程序的執(zhí)行結(jié)果被在于然后獲取插入在表變量保持CacheLog在消息對話結(jié)束表。
當(dāng)接收到的消息具有錯誤或結(jié)束消息類型時,過程也會結(jié)束對話,并且在錯誤類型上,將異常日志寫入CacheIntegrationErro?r表中。
該UpdateWebCache程序提取標(biāo)識和名稱,從作為參數(shù)傳遞傳入的XML消息,并在Python腳本文本嵌入這些值。腳本執(zhí)行結(jié)果集是類型為UpddateCacheLog的結(jié)構(gòu)化表。
?
?
該cacher的的服務(wù)代理對象,主要是UpdateMessage消息類型和CacheIntegration合同是相同的TransDB,CacheQueue有一個稱為激活過程,PerfomCacheUpdate,一個叫服務(wù)CacheTarget和路線大約有信息TransDB的服務(wù)CacheService和端點地址。
對于我們的示例解決方案,數(shù)據(jù)庫隊列的最大隊列讀取器設(shè)置為1。如果需要,可以增加這一點,例如,如果數(shù)據(jù)修改很高,并且您需要增加緩存刷新率。
服務(wù)代理端點
對于我們的解決方案,數(shù)據(jù)庫托管在同一個實例上,因此兩者都使用相同的Service Broker Endpoint來發(fā)送和接收消息。
?
但是,如果我們要在單個實例上托管數(shù)據(jù)庫,那么每個SQL實例的服務(wù)帳戶都應(yīng)該有一個Service Broker端點。并且這兩個SQL實例都應(yīng)該有權(quán)限允許將消息發(fā)送到對方的端點。連接的授權(quán)和授予可以通過以下TSQL命令集完成。請注意,在消息傳遞基礎(chǔ)結(jié)構(gòu)中,有一個發(fā)送方,另一方是接收方,正如所提到的,如果SQL實例是發(fā)送方和接收方的一部分,則每個實例都應(yīng)該有自己的進程標(biāo)識。下圖顯示了每個SQL Server在其自身身份下運行的方式。
?
這是用于在Cacher數(shù)據(jù)庫的SQL實例中授權(quán)和授予端點連接到TransDB的SQL實例服務(wù)帳戶[identity]的SQL代碼。
| ALTER AUTHORIZATION ON ENDPOINT::ServiceBrokerEndpoint TO [abc\TransDB_SVC] ??GO ??GRANT CONNECT ON ENDPOINT::ServiceBrokerEndpoint TO [abc\TransDB_SVC] ??GO |
類似地,這里是用于授權(quán)和授予端點連接到Cache的SQL實例服務(wù)帳戶[Identity]的代碼,在TransDB數(shù)據(jù)庫的SQL實例中。
| ALTER AUTHORIZATION ON ENDPOINT::ServiceBrokerEndpoint TO [abc\CacherAgent_SVC] ??GO ??GRANT CONNECT ON ENDPOINT::ServiceBrokerEndpoint TO [abc\CacherAgent_SVC] ??GO |
Python腳本
這是Python腳本文本,在TSQL變量@UpdateCache中保存為字符串。它具有具有邏輯的UpdateCache方法,通過傳遞具有作為輸入?yún)?shù)接收的Name和Id字段的數(shù)據(jù)對象來對RESTful.Cache執(zhí)行HTTP POST調(diào)用。它接收一個JSON對象,并將其作為方法的輸出結(jié)果返回給調(diào)用者。
在腳本結(jié)束時,返回的對象被轉(zhuǎn)換為數(shù)組,因此可以將其結(jié)構(gòu)化為SQL結(jié)果。
| DECLARE @UpdateCache NVARCHAR(MAX) = N' import pandas as PND #data structure package def UpdateCache(name,id): ??import requests as HTTP #http request package ??#Perfom HTTP POST to update cache ??httpRequest = HTTP.post( http://localhost/RESTful.Cache/ProductType/UpdateCache ,{ Name :name, Id :id}) ??cacheLog = httpRequest.json() ??return cacheLog ? #Update cache and build log element log = [UpdateCache( '+ @Name+' ,'+ CAST(@Id as VARCHAR(10)) +')] #Return data frame i.e. table structure from SQL OutputDataSet = PND.DataFrame(data=log) '; |
在SQL Server中使用Python腳本時,有一些值得注意的事情。
我們可以編寫一個連續(xù)的腳本或?qū)⑺鼈兎纸M到我們在這個解決方案中所做的方法中?;蛘?#xff0c;我們可以創(chuàng)建一個內(nèi)聯(lián)類或創(chuàng)建一個包,并在命令提示符下使用PIP命令在python中導(dǎo)入它們。
在這個MST的CPT版本中,import語句只能在它放置的范圍內(nèi)導(dǎo)入包,因此我們可以注意到ImportCache中存在導(dǎo)入請求import語句,并且import語句導(dǎo)入熊貓存在于腳本的頂部在腳本的最后。
方法UpdateCache的輸出對象立即轉(zhuǎn)換為數(shù)組,這樣pandas.DataFrame可以將對象轉(zhuǎn)換成數(shù)據(jù)結(jié)構(gòu),SQL Server可以輕松地將其解釋為具有行和列的表。
分配給OutputDataSet對象的數(shù)據(jù)結(jié)構(gòu)在SQL Server的TSQL執(zhí)行上下文中可用。
最后一行程序dbo。UpdateWebCache,WITH RESULT SETS(AS TYPE dbo.UpdateCacheLog);?具有用戶定義的表類型dbo.UpdateCacheLog,它有助于保持底層列的順序,并避免在從接收的數(shù)據(jù)結(jié)構(gòu)生成結(jié)果集的過程中發(fā)生任何不匹配。另一種方法是在Python和結(jié)果集中構(gòu)建映射列結(jié)構(gòu)。
數(shù)據(jù)庫安全
TransDB是一個OLTP數(shù)據(jù)庫,我們不希望對系統(tǒng)發(fā)生任何安全漏洞,因此,通過我們的示例解決方案,這種數(shù)據(jù)庫可以托管在未安裝“機器學(xué)習(xí)服務(wù)”的SQL實例上。Cacher是能夠到達基于網(wǎng)絡(luò)的系統(tǒng)的代理,因此可以保留在安裝機器學(xué)習(xí)服務(wù)的SQL實例上。兩個SQL實例都可以具有單獨的服務(wù)帳戶身份,該身份已被授權(quán)僅連接到特定端口的Service Broker端點。安全認(rèn)證通信的另一種方法是使用證書。對于Service Broker端點授權(quán),請參閱Microsoft.Technet:如何:通過使用證書允許服務(wù)代理程序網(wǎng)絡(luò)訪問(Transact-SQL)?更多細(xì)節(jié)。
所有組件放在一起
放置所有組件后,我們的WebApplication允許我們創(chuàng)建一個新的ProductType,并通過RESTful HTTP調(diào)用從刷新的緩存中列出相同的產(chǎn)品類型。在墻后面有管理數(shù)據(jù)的組件,高速緩存對前端應(yīng)用程序是不可見的。
?
結(jié)論
諸如電子商務(wù),醫(yī)療電子治理等應(yīng)用可以從良好的緩存實現(xiàn)中受益。通過擴展我們熟悉的技術(shù)的使用,我們可以獲得易于維護的解決方案,而無需學(xué)習(xí)新框架或功能的成本。
我們的示例解決方案符合我們所需要的
當(dāng)通過其中一個OLTP事務(wù)創(chuàng)建或修改數(shù)據(jù)時,系統(tǒng)刷新基于網(wǎng)絡(luò)的緩存系統(tǒng)進行讀取訪問。
它能夠使用異步事件來刷新緩存,靠近實時。這不會影響原始交易的表現(xiàn)。
它可以通過HTTP在事務(wù)和緩存系統(tǒng)之間繪制一條安全線,以保持?jǐn)?shù)據(jù)在OLTP數(shù)據(jù)庫中的安全。
它具有最小的監(jiān)控功能;?一個緩存日志和異常日志,可以進一步加強構(gòu)建管理控制臺。
使用Service Broker消息組件,解決方案足夠靈活,可以在異步消息處理發(fā)生時觸發(fā)或到達基于網(wǎng)絡(luò)的系統(tǒng)。換句話說,數(shù)據(jù)庫與SQL Service Broker消息集成在一起,并且基于接收到的數(shù)據(jù),執(zhí)行一個動作來獲取或發(fā)送數(shù)據(jù)到外部數(shù)據(jù)層以外的系統(tǒng)。
通過使用服務(wù)代理消息隔離外部系統(tǒng)觸發(fā)專用數(shù)據(jù)庫內(nèi)的事件有助于保護OLTP數(shù)據(jù)庫的事務(wù)和數(shù)據(jù)。?
(本帖轉(zhuǎn)譯于Hitendra Patel2017年8月04日發(fā)布于redgote 樞紐上的帖子:Python和SQL Server 2017的強大功能
? 地址鏈接:https://www.scarydba.com/2017/06/20/database-fundamentals-3-whats-database/)
原文地址:http://www.cnblogs.com/fenglianchen/p/7670328.html
.NET社區(qū)新聞,深度好文,歡迎訪問公眾號文章匯總 http://www.csharpkit.com
總結(jié)
以上是生活随笔為你收集整理的Python和SQL Server 2017的力量的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用Identity Server 4建
- 下一篇: 用 Identity Server 4