在服务器崩溃的情况下,我需要什么类型的架构来处理部分完成的操作?
What type of architecture would I need to deal with partially-completed operations in the event of a server crash?
我在一个由 ASP.NET 5 提供支持的社交网络上工作了六个多月。
当我思考我的架构时,我意识到它存在各种各样的问题。最大的问题之一是,如果服务器出现故障(无论出于何种原因),在中断时发生的任何操作都将丢失。例如,用户删除相册,以及与之关联的图片。系统删除相册记录,导致服务器崩溃。重新启动后,删除操作将丢失,然后我的数据库将被冗余的图片记录弄得乱七八糟,我的存储服务器将具有冗余的图像文件。
什么样的架构可以让我解决这个问题?
如果您真的认为这会成为一个问题,您可能需要在服务器上多花点钱。
话虽如此,这种边缘情况始终存在。在客户端和服务器之间始终存在仍在传输中的 HTTP 请求,或者 只是 在服务器出现故障时到达代码的第一行 - 没有你已存储请求数据,因此您无法重复。
对于这个原则你真的无能为力。
您可以使用事务让数据库操作保持 atomic(即全部发生或 none 发生),但是当您有需要在两个数据库中发生的工作时和文件系统保持同步,你有一个不同的问题。
不过你可以引入某种职业系统。 "delete photo album job" 可能如下所示:
- 用户点击"Delete album"。
- 系统在数据库中存储了一个"DeleteAlbumJob"。专辑保持在线(数据库)和存在(文件系统)。
- 作业系统处理作业直到标记为成功完成。
作业系统 for example one through Hangfire 逐步处理这些作业 - 记录它的位置。例如,相册中的照片已从文件系统中删除,但相册仍然存在于数据库中,并且服务器宕机了。现在下次重新启动时,服务将再次启动,作业将从它离开的地方继续处理。
在与在数据库中创建工作相同的事务中,您可以将相册标记为 "DeletionPending",这样它就不会再显示给用户。
我在一个由 ASP.NET 5 提供支持的社交网络上工作了六个多月。
当我思考我的架构时,我意识到它存在各种各样的问题。最大的问题之一是,如果服务器出现故障(无论出于何种原因),在中断时发生的任何操作都将丢失。例如,用户删除相册,以及与之关联的图片。系统删除相册记录,导致服务器崩溃。重新启动后,删除操作将丢失,然后我的数据库将被冗余的图片记录弄得乱七八糟,我的存储服务器将具有冗余的图像文件。
什么样的架构可以让我解决这个问题?
如果您真的认为这会成为一个问题,您可能需要在服务器上多花点钱。
话虽如此,这种边缘情况始终存在。在客户端和服务器之间始终存在仍在传输中的 HTTP 请求,或者 只是 在服务器出现故障时到达代码的第一行 - 没有你已存储请求数据,因此您无法重复。
对于这个原则你真的无能为力。
您可以使用事务让数据库操作保持 atomic(即全部发生或 none 发生),但是当您有需要在两个数据库中发生的工作时和文件系统保持同步,你有一个不同的问题。
不过你可以引入某种职业系统。 "delete photo album job" 可能如下所示:
- 用户点击"Delete album"。
- 系统在数据库中存储了一个"DeleteAlbumJob"。专辑保持在线(数据库)和存在(文件系统)。
- 作业系统处理作业直到标记为成功完成。
作业系统 for example one through Hangfire 逐步处理这些作业 - 记录它的位置。例如,相册中的照片已从文件系统中删除,但相册仍然存在于数据库中,并且服务器宕机了。现在下次重新启动时,服务将再次启动,作业将从它离开的地方继续处理。
在与在数据库中创建工作相同的事务中,您可以将相册标记为 "DeletionPending",这样它就不会再显示给用户。