Tag: 分布式

如何防止由mongodb支持的分布式nodejs web服务器体系结构中的竞争条件

这是我的问题的描述: 我有一个在负载平衡器背后的nodejs(express.js)中编写的x web工作者。 这些工作人员将数据写入mongodb(mongoose.js) 我已经设置了端点y,使得在处理程序的中间件链中的某个点处,我正在执行以下逻辑:如果请求用户存在于数据库中,那么获取它,更新一些字段然后将其存回。 如果不存在,则将其插入到mongo中。 注意! 我无法使用Mongoose的findAndUpdateOne() – 这将是primefaces – 由于域特定的逻辑,即。 如果用户已经存在用特定的值更新它,否则插入另一个值。 问题通常是,来自同一用户的两个请求(谁还没有在数据库中)将会遇到两个不同的工作人员。 当用户处理中间件时,两个工作人员都会确定用户不存在,并尝试插入并更新。 自然这会导致错误,例如。 validation错误:我已经为每个用户validation和其他设置了一个唯一的电子邮件 我怎样才能防止这个?

用Cassandra在Node.js中的多数据中心环境中分配计划任务

我们正试图build立一个系统,从Cassandra数据库获得一个执行任务列表,然后通过某种团体共识创build一个执行计划(最好在一个节点上),然后由整个服务器集群同意和执行。 我们真的不想添加任何额外的软件,如Redis或AMPQ系统,而是直接build立在所有运行这些作业的服务器上。 到目前为止,我们已经发现了Skiff,一种Raftalgorithm的实现,它看起来可以完成任务,但是我想知道是否有人以纯粹的Node.js方式find了一个不涉及外部消息传递系统的优雅解决scheme。

UDP多播系统

我正在尝试创build一个分布式信息系统,使用对等体系结构与多播通信。 首先我开始实现组播通信。 我从来没有这样做,所以我有一些难以理解的问题,为什么它不能正常工作。 这是我设法做到的: 服务器 var SRC_PORT = 6025; var PORT = 6024; var MULTICAST_ADDR = '239.255.255.250'; var dgram = require('dgram'); var server = dgram.createSocket("udp4"); server.bind(SRC_PORT, function () { setInterval(multicastNew, 4000); }); function multicastNew() { var message = new Buffer("Multicast message!"); server.send(message, 0, message.length, PORT , MULTICAST_ADDR, function () { console.log("Sent '" + message + […]

“重新sorting”消息在无序处理之后

我正在研究基本上是高度可用的分布式消息传递系统。 系统通过HTTP或TCP接收来自某个地方的消息,对其执行各种转换,然后将其发送到一个或多个目的地(也使用TCP / HTTP)。 系统要求发送到给定目的地的所有消息都是有序的,因为一些消息build立在以前的内容上。 这限制了我们按顺序处理消息,每条消息大约需要750ms。 所以如果有人发送给我们,例如,每250ms一条消息,我们不得不将消息排在对方之后。 这最终会在高负载下的消息处理中引入无法忍受的延迟,因为每个消息在轮到它之前可能不得不等待数百个其他消息被处理。 为了解决这个问题,我希望能够并行化我们的消息处理,而不会破坏我们发送它们的顺序的要求。 我们可以轻松地横向扩展处理。 丢失的部分是一种确保即使消息被乱序处理也将被“重新sorting”并按照接收顺序发送到目的地的方法。 我试图find实现这一目标的最佳方法。 Apache Camel有一个叫Resequencer的东西 ,它包含了一个很好的图(我没有足够的代表直接embedded)。 这正是我想要的:把乱序信息放在一边的东西。 但是,我不希望它是用Java编写的,我需要的解决scheme是高度可用的(即抵制典型的系统故障,如崩溃或系统重启),我不认为Apache Camel提供。 我们的应用程序是用Node.js编写的,使用Redis和Postgresql来进行数据持久化。 我们使用Kue库来处理消息队列。 尽pipeKue提供了优先级排队function,但function集对于上述用例来说太有限了,所以我认为我们需要一种替代技术与Kue一起重新sorting我们的消息。 我试图在网上研究这个话题,而且我也找不到像我预期的那么多的信息。 看起来像分布式架构模式的types将有文章和实现丰富,但我没有看到这么多。 search诸如“消息重新sorting”,“乱序处理”,“并行消息处理”等等的东西,大多只是放松了基于分区或主题或者什么的“有序”需求的解决scheme。 或者,他们谈论在一台机器上的并行化。 我需要一个解决scheme: 可以按任意顺序同时处理多个消息。 无论按照什么顺序处理,总会按照到达系统的顺序发送消息。 可以从Node.js使用 可以在高可用性环境下运行(即在同一消息队列上运行的多个实例不会出现不一致)。 我们目前的计划对我来说是有意义的,但在网上任何地方我都找不到。我们现在的计划是使用Redis来维护一套正在进行的和准备发送的消息,按照到达时间进行sorting。 粗略地说,它的工作原理是这样的: 当收到消息时,该消息被放置在正在进行的设置中。 当消息处理完成时,该消息被置于准备发送集合上。 只要在进行中和准备发送的集合的前面有相同的消息,就可以发送该消息并且按顺序发送。 我将编写一个小型的Node库,使用primefacesRedis事务,使用优先级队列式API实现此行为。 但是这只是我自己想出来的,所以我想知道:是否有其他技术(理想情况下使用Node / Redis堆栈,我们已经在这里)解决重新sorting无序消息的问题? 还是有其他一些术语可以用作研究的关键字吗? 谢谢你的帮助!

在Node.js中保存应用程序状态

如何保存node.js的应用程序状态主要由HTTP请求组成的应用程序? 我在Node.JS中有一个脚本,它使用RESTful API将大量(10,000多种)产品导入到电子商务应用程序中。 API对请求数量有限制,我们正盯着这个限制。 在以前的运行中,脚本退出时出现Error: connect ETIMEDOUT可能是由于超出了API限制。 我想能够尝试连接5次,如果一小时后恢复失败,恢复限制。 在发生崩溃的情况下(停电,networking崩溃等),保存整个过程也是有益的。 并且能够从停止的位置恢复脚本。 我知道Node.js是一个巨大的事件队列,所有的http请求和它们的callback都会被放到这个队列中(和其他一些事件一起)。 这使得它成为保存当前执行状态的主要目标。 其他令人愉快的(对于这个项目来说不是完全必要的)将能够在不同networking上的多个机器之间分配工作以增加吞吐量。 那么现在有没有办法做到这一点? 一个框架也许? 或者我需要自己实现这一点,在这种情况下,任何有用的资源如何做到这一点将不胜感激。

如何devise一个分布式的node.js web服务器

Supose我需要实现一个Web应用程序,将有大量的并发用户。 我决定使用node.js,因为它扩展得非常好,性能良好,开源社区等等。为了避免瓶颈,我可以在同一个事件循环中使用用户,我决定使用一个簇进程利用多核CPU。 此外,我有3台机器(main + 2),因为我需要使用Cassandra来处理大数据。 真棒,这意味着我有3 * n node.js进程,其中n是CPU的核心数(机器是相同的)。 好吧,然后我开始研究,我以下面的模式结束: Nginx监听端口80,只用于静态内容(img,css,js等)。 将dynamicstream量转发给haproxy。 我知道如何configurationnginx,但我仍然需要看看haproxy,所以我会说,haproxy正在监听端口4000. Nginx和haproxy安装在主机(入口点)。 3台机器之间的Haproxy负载平衡。 它将stream量转发到端口4001,即node.js进程正在侦听4001。 每个node.js都有一个包含n个进程的集群,监听4001。 如果我是正确的,单个http请求将被转发到单个node.js进程。 创build一个会话是很正常的,对吧? 一个会话只是一个地图,而这个地图是一个Object,而这个Object住在一个node.js进程中。 Haproxy将configuration一个循环调度程序,所以同一个用户可以被转发到不同的node.js进程。 如何跨所有node.js进程共享相同的会话对象? 我如何共享一个全局对象(这包括在同一台机器(node.js集群)和整个networking中)? 我应该如何devise一个带有node.js的分布式Web应用程序? 有没有任何模块,缓解同步任务?