在内存中的对象发生更改时同步内存和数据库对象

问题描述

我目前正在使用实体框架在.net core(C#)中实现Web应用程序。在从事该项目时,我实际上遇到了很多挑战,但我将从我认为最重要的挑战开始。我的问题如下:

  1. 我没有从数据库中频繁加载数据,而是拥有一组静态对象,这些对象是数据库中数据的镜像。但是,当我要确保进行任何更改(即将对象的添加/删除/修改实时保存到数据库中)时,这很繁琐且容易出错。有什么好的例子或建议可供我参考,以改进自己的方法吗?

  2. 另一件事是,某些对象的属性值将根据其他一些对象的属性值而即时更改。类似电子表格的表格,如果公式所引用的单元格中的值发生更改,则该单元格的值将自动更改。我还没有解决方案。欣赏是否有人可以参考我的例子。但这将增加另一层复杂性,以将内存中对象的更改同步到数据库

目前,我不确定是否有更好的方法。感谢任何人都可以提供帮助。谢谢!

解决方法

基本上,您会遇到一个称为最终一致性的问题。某些更改和两个或多个系统需要同时注意。这里的问题是,为了使操作成功,需要同时应用这两个更改。如果任何一个失败,则需要知道。

在您的情况下,我将使用Azure Service Bus。您可以创建队列并将消息放入队列。 Azure函数将处理这些队列消息。您将创建两个队列,一个队列用于数据库更新,一个队列用于内存中更新(我认为将其更改为缓存服务可能需要考虑)。现在,这些队列的优点是您可以轻松地从任何地方将消息放入这些队列中。因为您提到对象将要进化,所以您可能需要在数据库或内存(缓存)中更新这些对象。

完成此操作后,我将创建一个包含两个订阅的主题。一个转发消息到队列1,另一个转发到队列2。这将解决您的主要问题。万一对象发生变化,只需将其发送到主题即可。这两个更改(数据库和内存)都将自动执行。

您现在遇到的唯一问题是,您提到要实时更新数据库。在这种情况下,您将不得不离开。

此外,您需要确保对队列有适当的警报,以防万一您错过了一条消息,或者您的功能不能很好地处理它,您将收到一条警报以检查并更正错误

,

我完全同意@nineedm的回答,但还有其他解决方案。

如果引入缓存,将始终面临缓存重新验证问题-更改数据时必须将缓存标记为无效。有时,这很容易,具体取决于缓存数据的性质和数据更改的频率。

如果只有一个应用程序,则使用适当的指定到期选项可以满足MemoryCache的需求。 如果存在群集-您必须查看分布式缓存解决方案,例如Redis。有关于该Distributed caching in ASP.NET Core

的MS文章