每次调用我的 Web API 时,我都需要登录数据库。现在,我当然不想在每次通话时都访问我的数据库。
所以假设我的缓存中有一个字典或一个哈希表对象,每 10000 条记录我都会进入数据库。
我仍然不希望每 10000 个用户都等待这个操作。而且我不能为长时间的操作启动不同的线程,因为应用程序池基本上可以随时回收。
这种情况的最佳解决方案是什么?
谢谢
每次调用我的 Web API 时,我都需要登录数据库。现在,我当然不想在每次通话时都访问我的数据库。
所以假设我的缓存中有一个字典或一个哈希表对象,每 10000 条记录我都会进入数据库。
我仍然不希望每 10000 个用户都等待这个操作。而且我不能为长时间的操作启动不同的线程,因为应用程序池基本上可以随时回收。
这种情况的最佳解决方案是什么?
谢谢
我认为你对持久性的看法是相当不一致的。由于应用程序池回收或服务器崩溃,您的 10000 个对象的缓存也可能随时丢失。
但是对于如何在不导致用户等待的情况下执行大型操作的原始问题:
限制应用程序池回收并处理潜在的数据丢失。
定期将缓存的消息转储到 Windows 服务以进行进一步处理。这仍然不能 100% 保证保存数据,例如服务/服务器可能会崩溃。
使用消息队列 ( MSMQ ),可能与 WCF 一起使用。消息队列可以持久保存到磁盘,因此可以认为这是相当可靠的。
消息队列 (MSMQ) 技术使在不同时间运行的应用程序能够跨异构网络和可能暂时离线的系统进行通信。应用程序将消息发送到队列并从队列中读取消息。
Message Queuing provides guaranteed message delivery, efficient routing, security, and priority-based messaging. It can be used to implement solutions to both asynchronous and synchronous scenarios requiring high performance.
Taking this a step further...
Depending on your requirements and/or environment, you could probably eliminate your cache, and write all messages immediately (and rapidly) to a message queue and not worry about performance loss or a large write operation.