跨多个 DbContext 的 EF Core 事务与队列消息
EF Core Transactions across multiple DbContexts vs Queue msg
当 storing/updating 数据跨多个 DbContex 时使用什么方法?
性能比较:以及在什么情况下使用什么:
using (var scope = new TransactionScope())
{
using (var context1 = new ItemContext(userOptions))
{
context1.Items.Add(item);
context1.SaveChanges();
}
using (var context2 = new OrderContext(orderOptions))
{
testOrder.ItemId = item.Id;
context2.Orders.Add(testOrder);
context2.SaveChanges();
}
if(testOrder.SunIsShining){
using (var context1 = new ItemContext(itemOptions))
{
item.SunIsShining= true;
context1.Items.Update(item);
context1.SaveChanges();
}
}
scope.Complete();
}
一个。上面的示例使用事务范围并在同一物理服务器中的不同上下文之间更改/更新记录。
乙。使用消息。例如在将用户保存到 db 之后。调用消息服务,将信息消息插入队列(项目信息记录)。
然后 ItemOrderProcessingService 将读取该队列,例如每 10 秒获取其中的所有新记录。
并分批创建订单,如果需要,也许也可以分批更新项目 table 中的某些项目状态。
(如果需要,具有回滚更改的逻辑)
何时使用哪种方法,优点/缺点是什么? f.e。如果我们每天有大约 2k 笔交易,这是相当低的......
每天应该有多少交易必须使用 B. 队列方法?
这是完全不同的方法。当您使用事务时,为所有上下文执行回滚要简单得多。在基于消息的系统中需要一些时间,直到您的消息将被所有服务处理,您还应该处理服务失败并检查数据一致性
基于消息需要团队付出更多努力来维护和支持处理消息的微服务,对于像您这样的小型应用程序,使用单体应用程序是完全可以的。
当 storing/updating 数据跨多个 DbContex 时使用什么方法? 性能比较:以及在什么情况下使用什么:
using (var scope = new TransactionScope())
{
using (var context1 = new ItemContext(userOptions))
{
context1.Items.Add(item);
context1.SaveChanges();
}
using (var context2 = new OrderContext(orderOptions))
{
testOrder.ItemId = item.Id;
context2.Orders.Add(testOrder);
context2.SaveChanges();
}
if(testOrder.SunIsShining){
using (var context1 = new ItemContext(itemOptions))
{
item.SunIsShining= true;
context1.Items.Update(item);
context1.SaveChanges();
}
}
scope.Complete();
}
一个。上面的示例使用事务范围并在同一物理服务器中的不同上下文之间更改/更新记录。
乙。使用消息。例如在将用户保存到 db 之后。调用消息服务,将信息消息插入队列(项目信息记录)。 然后 ItemOrderProcessingService 将读取该队列,例如每 10 秒获取其中的所有新记录。 并分批创建订单,如果需要,也许也可以分批更新项目 table 中的某些项目状态。 (如果需要,具有回滚更改的逻辑)
何时使用哪种方法,优点/缺点是什么? f.e。如果我们每天有大约 2k 笔交易,这是相当低的...... 每天应该有多少交易必须使用 B. 队列方法?
这是完全不同的方法。当您使用事务时,为所有上下文执行回滚要简单得多。在基于消息的系统中需要一些时间,直到您的消息将被所有服务处理,您还应该处理服务失败并检查数据一致性
基于消息需要团队付出更多努力来维护和支持处理消息的微服务,对于像您这样的小型应用程序,使用单体应用程序是完全可以的。