Unity DI在异步操作上行为不当



我们有一个旧的多租户(每个租户都有自己的数据库,但它们都共享相同的代码和VMS(系统,构建了ASP.NET MVC 4.由于某些性能,我们开始逐步改变它的问题。

我们做的一件事是使用Unity与DI/IOC合作。到目前为止,在容器上唯一注册的是使用PerRequestLifetimeManager的EF DBContext。到目前为止,尚无其他项目注册。每当服务或控制器进行启动时,

我们做的另一件事是使某些操作异步...我们计划使它们都异步,但我们要一个一个。

我们的内部测试成功了,我们部署了生产。

经过几个小时的真实流量,我们开始注意到一些问题……莫名其妙的错误,该系统报告了一堆东西,其中根本原因是:" ID不存在"。对于特定的租户来说,这些相距很远(每天每天不到10次 - 每位租户3K操作的使用情况(,但总共,这变得非常令人担忧。手动捕获和执行总是返回预期的结果。

错误地,某个时刻的一个开发人员记录了EF的完整连接字符串正在使用,为我们惊讶的是,错误的数据库被击中了!客户A确实试图从客户端B数据库中阅读一些内容!

到处都是,我们经历了TransactionScopeAsyncFlowOption.Enabled<add key="aspnet:UseTaskFriendlySynchronizationContext" value="true" />,但是错误仍在发生...

我们认为这里有两个可能的位置是根本原因:要么在创建dbcontext时搞砸了,要么当我们呼吁Resolve时放弃了错误的实例。

因为创建逻辑根本没有变化,并且以前没有发生这种情况,所以我们认为团结在这里有错。

据我们所知,没有使用DI的同步操作(现在约有95%的系统,5%是异步OPS(曾经有过这样的问题。

有人对可能发生的事情有任何了解吗?

详细信息:
- 在Azure App Services上进行启用,框架版本4.6 - Horizontal量表。但是,即使只有1个实例可以处理负载

,这也会发生。

解决所有问题(例如,在构造函数上(,这一切都很好...

最新更新