我正在构建一个用户将要输入的网站,并且在特定时间之后必须运行算法,以便获取存储在数据库中的用户的输入并为他们存储创建一些结果结果也在数据库中。问题是在nodejs我无法弄清楚我应该在哪里以及如何实现这个算法,以便在特定的时间后运行一次(每隔几分钟或几秒)。 该应用程序在nodejs-expressjs中构建。 例如,假设我启动应用程序,3分钟后算法应运行并从数据库中获取一些数据,并在算法创建后,再次将其存储在数据库中。 有什么典型的解决方案(至少有一个是足够的)。谢谢!
答案 0 :(得分:1)
假设您有一个用户请求,可以保存网址以便抓取并获取列出的产品
所以最简单的方法之一是: 在用户请求中创建DB“tasks”表
userId | urlToCrawl | dateAdded | isProcessing | ....
然后在节点主站点中有一些setInterval(findAndProcessNewTasks,60000) 所以它将获得当前没有工作的所有任务(isProcessing为false) 每1分钟或您需要的任何间隔
<强> findAndProcessNewTasks 强> 将查询db并为每个尚未处理的记录运行算法 它也会将isProcessing设置为true 最终一旦算法完成,它将从任务中删除记录(或将另一个字段标记为“已完成”为真)
根据负载和任务数量,在另一个节点应用程序中处理算法可能有意义
通常你会有一个消息总线(Kafka,rabbitmq等),主应用程序只发送事件和工作者node.js应用程序正在做实际工作并将产品插入数据库
这将使主应用程序轻量级并允许扩展工作程序应用程序
答案 1 :(得分:0)
如果我理解正确 - 我会在呈现页面时将数据发送到客户端并将其存储到某个隐藏标记中(例如输入类型=&#34;隐藏&#34;)。然后我将在服务器端使用setTimeout运行一个脚本,以向客户端显示数据。
答案 2 :(得分:0)
从您的问题出发,不清楚您是要在Web服务器上运行该算法(也许处理来自多个用户的输入)还是在客户端上运行该算法(处理来自特定用户的输入)。
如果是前者,则在创建Web服务器侦听器的主javascript文件中使用setTimeout()或类似方法。然后,您的服务器可以处理用户的输入(通过应用程序侦听器),并以并行运行的算法查看数据库。
如果是后者,则在要加载到用户浏览器的javascript代码中使用setTimeout()或类似的方法。
实际上,您可能需要以上各项的组合:在服务器上运行的代码定期在中央数据库上进行一些处理,以及在每个用户的浏览器中运行的代码定期从服务器下拉的新数据刷新用户的显示。
您可能还希望在客户端和服务器之间实现websocket和json rpc接口。然后,您可以让客户端监听Websocket上到达的事件,而不是让客户端“轮询”服务器以获取算法结果。
希望有帮助!