我们有一个传统的多租户(每个租户拥有自己的数据库,但它们共享相同的代码和虚拟机)系统建立在asp.net MVC 4上。由于一些性能问题,我们开始稍微改变一下,一块一块。
我们做的一件事是使用统一使用DI / IoC。到目前为止,容器上注册的唯一内容是使用PerRequestLifetimeManager
的EF DbContext。到目前为止还没有其他项目注册。每当服务或控制器获得实例化时,
我们做的另一件事是让一些操作异步......我们计划让它们全部异步但我们一个接一个地去。
我们的内部测试成功,我们部署到生产中。
经过几个小时的实际流量后,我们开始注意到一些问题......系统报告了一堆事情的莫名其妙的错误,其根本原因是:“Id不存在”。对于特定的租户而言,这些距离相差甚远(每个租户每天发生的次数少于10次 - 每个租户每天平均使用3k次操作)但总的来说,这变得非常令人担忧。手动捕获和执行始终返回预期结果。
错误地,某个开发者在某个时刻记录了EF正在使用的完整连接字符串,而且出乎意料的是,错误的数据库被击中了!客户端A确实试图从客户端B数据库中读取内容!
遍布整个地方,我们经历了TransactionScopeAsyncFlowOption.Enabled
和<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />
,但错误仍在发生......
我们认为这里有两个可能的根本原因:我们要么在创建DbContext时搞砸了,要么在我们呼叫Resolve
时团结放弃了错误的实例。
因为创建逻辑根本没有改变而且之前没有发生过,所以我们认为Unity在这里有过错。
重要的是要注意,据我们所知,没有使用DI的同步操作(现在大约95%的系统,5%是异步操作)都遇到过这样的问题。
任何人都知道可能会发生什么?
详细说明:
-Hosted on Azure App Services,框架版本4.6
- 水平刻度。但即使只有一个实例可以处理负载
答案 0 :(得分:0)
预先解决所有问题(例如在构造函数上)并且一切都会好起来......