SQL数据库和服务代理
OLTP数据库TransDB有几个对象,包括表,存储过程和Service Broker对象。
为了我们的目的,UpdateProductType过程使用新记录更新ProductType表,AcknowledgeProductTypeCache过程是CacheIntegration队列的激活过程,当处理消息时即从Cacher数据库接收来自目标的确认。它还处理异常,如果有的话,并将其记录在CacheIntegrationError表中。
有关Service Broker的更多信息,请访问Microsoft.DOC:SQL Server Service Broker
对于我们的示例解决方案,TransDB是创建新的ProductType记录时创建更新缓存消息的源数据库,执行操作的消息,它具有UpdateMessage消息类型,CacheIntegration合同将CacheSource服务发送到目标数据库。该服务具有CacheQueue,由Service Broker组件用于执行可靠的消息传递。该ToCacheTarget路由具有信息传递消息到它的目标。
为了消除任何增加事务处理时间的机会以及避免事务数据库中其余数据的任何安全风险,我们将通过使用我们的示例解决方案中名为Cacher数据库的代理数据库来解除缓存更新过程。Service Broker消息传递基础设施将有助于连接TransDB和Cacher数据库,基于事件的消息处理将使我们能够更新驻留在基于网络的系统上的缓存存储。该cacher的数据库是打在订单的最新消息到达时进行缓存刷新代理的角色。它通过执行Python脚本更新缓存。
Cacher数据库具有:
1. CacheLog和CacheIntegration错误表,以跟踪缓存何时被刷新,并且具有在缓存刷新过程中可能发生的任何错误的记录。
2. 所述PerformCacheUpdate过程从接收传入消息TransDB通过服务代理。如果消息的类型是UpdateMessage,那么它将执行另一个过程UpdateWebCache,执行Python脚本执行。
a. UpdateWebCache过程的执行结果保存在表变量中,然后在消息对话结束时插入到CacheLog表中。。
b. 当接收到的消息具有错误或结束消息类型时,过程也会结束对话,并且在错误类型上,将异常日志写入CacheIntegrationError表中。
3. 该UpdateWebCache程序提取标识和名称,从作为参数传递传入的XML消息,并在Python脚本文本嵌入这些值。脚本执行结果集是类型为UpddateCacheLog的结构化表。
该cacher的服务代理对象,主要是UpdateMessage消息类型和CacheIntegration合同是相同的TransDB,CacheQueue有一个称为激活过程,PerfomCacheUpdate,一个叫服务CacheTarget和路线大约有信息TransDB的服务CacheService和端点地址。
对于我们的示例解决方案,数据库队列的最大队列读取器设置为1。如果需要,可以增加这一点,例如,如果数据修改很高,并且您需要增加缓存刷新率。
服务代理端点
对于我们的解决方案,数据库托管在同一个实例上,因此两者都使用相同的Service Broker Endpoint来发送和接收消息。
但是,如果我们要在单个实例上托管数据库,那么每个SQL实例的服务帐户都应该有一个Service Broker端点。并且这两个SQL实例都应该有权限允许将消息发送到对方的端点。连接的授权和授予可以通过以下TSQL命令集完成。请注意,在消息传递基础结构中,有一个发送方,另一方是接收方,正如所提到的,如果SQL实例是发送方和接收方的一部分,则每个实例都应该有自己的进程标识。下图显示了每个SQL Server在其自身身份下运行的方式。
这是用于在Cacher数据库的SQL实例中授权和授予端点连接到TransDB的SQL实例服务帐户[identity]的SQL代码。
ALTER AUTHORIZATION ON ENDPOINT::ServiceBrokerEndpoint TO [abc\TransDB_SVC]
GO
GRANT CONNECT ON ENDPOINT::ServiceBrokerEndpoint TO [abc\TransDB_SVC]
GO
类似地,这里是用于授权和授予端点连接到Cache的SQL实例服务帐户[Identity]的代码,在TransDB数据库的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方法,通过传递具有作为输入参数接收的Name和Id字段的数据对象来对RESTful.Cache执行HTTP POST调用。它接收一个JSON对象,并将其作为方法的输出结果返回给调用者。
在脚本结束时,返回的对象被转换为数组,因此可以将其结构化为SQL结果。
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脚本时,有一些值得注意的事情。
1. 我们可以编写一个连续的脚本或将它们分组到我们在这个解决方案中所做的方法中。或者,我们可以创建一个内联类或创建一个包,并在命令提示符下使用PIP命令在python中导入它们。
2. 在这个MST的CPT版本中,import语句只能在它放置的范围内导入包,因此我们可以注意到ImportCache中存在导入请求import语句,并且import语句导入熊猫存在于脚本的顶部在脚本的最后。
3. 方法UpdateCache的输出对象立即转换为数组,这样pandas.DataFrame可以将对象转换成数据结构,SQL Server可以轻松地将其解释为具有行和列的表。
4. 分配给OutputDataSet对象的数据结构在SQL Server的TSQL执行上下文中可用。
5. 最后一行程序dbo。UpdateWebCache,WITH RESULT SETS(AS TYPE dbo.UpdateCacheLog);具有用户定义的表类型dbo.UpdateCacheLog,它有助于保持底层列的顺序,并避免在从接收的数据结构生成结果集的过程中发生任何不匹配。另一种方法是在Python和结果集中构建映射列结构。
数据库安全
TransDB是一个OLTP数据库,我们不希望对系统发生任何安全漏洞,因此,通过我们的示例解决方案,这种数据库可以托管在未安装“机器学习服务”的SQL实例上。Cacher是能够到达基于网络的系统的代理,因此可以保留在安装机器学习服务的SQL实例上。两个SQL实例都可以具有单独的服务帐户身份,该身份已被授权仅连接到特定端口的Service Broker端点。安全认证通信的另一种方法是使用证书。对于Service Broker端点授权,请参阅Microsoft.Technet:如何:通过使用证书(Transact-SQL)允许服务代理程序网络访问以获取更多详细信息。
所有组件放在一起
放置所有组件后,我们的WebApplication允许我们创建一个新的ProductType,并通过RESTful HTTP调用从刷新的缓存中列出相同的产品类型。在墙后面有管理数据的组件,高速缓存对前端应用程序是不可见的。
结论
诸如电子商务,医疗电子治理等应用可以从良好的缓存实现中受益。通过扩展我们熟悉的技术的使用,我们可以获得易于维护的解决方案,而无需学习新框架或功能的成本。
我们的示例解决方案符合我们所需要的
? 当通过其中一个OLTP事务创建或修改数据时,系统刷新基于网络的缓存系统进行读取访问。
? 它能够使用异步事件来刷新缓存,靠近实时。这不会影响原始交易的表现。
? 它可以通过HTTP在事务和缓存系统之间绘制一条安全线,以保持数据在OLTP数据库中的安全。
? 它具有最小的监控功能; 一个缓存日志和异常日志,可以进一步加强构建管理控制台。
? 使用Service Broker消息组件,解决方案足够灵活,可以在异步消息处理发生时触发或到达基于网络的系统。换句话说,数据库与SQL Service Broker消息集成在一起,并且基于接收到的数据,执行一个动作来获取或发送数据到外部数据层以外的系统。
? 通过使用服务代理消息隔离外部系统触发专用数据库内的事件有助于保护OLTP数据库的事务和数据。(
https://www.red-gate.com/simple-talk/sql/sql-development/power-python-sql-server-2017/)