仅通过http

时间:2016-03-09 08:13:04

标签: node.js multithreading express socket.io

对于使用Nodejs,Express和Jade模板时的示例,我有一个问题。

所有示例都显示了如何构建某种用户管理界面,您可以在其中添加用户配置文件,删除它们并对其进行管理。

这些被认为是NodeJ的初学者指南。我的问题是,如果我有10个用户同时访问同一个接口并执行相同的操作,那么NodeJs肯定会阻止其他用户在同一端口上运行时的请求。

所以,让我说我正在提取一个类似于10000的用户列表。是的我可以进行分页,但这不是重点。当我从服务器获取列表时,另外4个用户想要访问该应用程序。他们必须等待我的进程结束。这是我的问题 - 如何避免使用NodeJS&表达

我在这个问题上待了几个月!我目前有适当的地方可以做到以下几点:

  1. 在端口上运行东西的主要处理
  2. 在不同的端口上运行Socket.io进程
  3. 使用粘性会话
  4. 我的想法是我做了一个请求(比如获取一个项目列表),并立即响应一些请求参考,但没有请求的项目,从而释放端口。
  5. 在后台“异步”然后我做了获取项目的过程。完成后,我从一个节点向套接字节点端口节点发出http请求,发送项目。
  6. 完成后,我执行socket.io emit WITH数据和初始请求引用,以便正确的用户获取消息。
  7. 在客户端,我有一个侦听套接字的事件,然后通过填充列表来完成ajax请求。
  8. 我在这方面取得了一些成功!它实际上有一定程度的作用!我有一个在线问题,由于IP地址,socket.io播放有趣的问题复杂化。

    我也有多个使用群集的工作人员。我用以下方式使用它:

    1. 我创建了一个主工作者
    2. 我产生了工人
    3. 我接受任何连接请求并将其传递给相关工作人员。
    4. 我为主节点请求以及套接字请求执行此操作。就像我说我用2个端口!

      正如您所看到的,我已经完成了很多工作,但我没有得到正确的解决方案!

      我的问题是这个问题 - 我是否只是因为错过了一些简单的事情而去世界各地10次?这听起来很难实现非阻塞nodejs唯一的网站。

      我问自己 - 当然所有这些教程都不会错过这么重要的东西!但他们确实做到了!

      我已经研究,阅读并测试了很多代码 - 这是我第一次在stackoverflow上提出任何问题!

      感谢您的帮助。

      P.S。同一方法的一个例子是:我使用jasper请求报告,我传递参数,并且如上所述使用“延迟ajax响应”方法我只是释放端口,并且在后台生成非常密集的报告(这可能是一个非常密集的过程,因为正在进行大量的计算)..!我真的没有看到更好的方法 - 任何帮助都将受到超级赞赏!

      感谢您抽出宝贵时间阅读!

1 个答案:

答案 0 :(得分:1)

我很抱歉地说出来,但是,你曾经去世界各地10次,只是因为错过了一些简单的东西。

很明显,您以前的网络服务器知识/经验来自阻止的观点,如果是这种情况,您的担忧是有效的。

Node.js是一个专注于使用单个线程来执行代码的框架,这意味着如果它执行任何阻塞操作,其他任何人都无法完成任何操作。

有些操作可以在节点中执行此操作,例如读取/写入磁盘。但是,大多数节点操作都是异步的。

我相信你熟悉这个词,所以我不会详细说明。异步操作允许节点执行的操作是尽可能地保持此单线程空闲。闲置我的意思是开放其他工作。如果您的代码是完全异步的,那么处理4个并发用户(甚至400个)不应该成为问题,即使对于单个线程也是如此。

现在,关于端口的初始问题:一旦在给定端口上收到请求,node.js就会执行你为它编写的任何代码,直到它遇到异步操作,一旦发生,它就是可以在同一个端口上接收更多请求。

您询问的第二个问题是数据库操作。在这种情况下,node-js会将查询发送到数据库(根本不需要时间),数据库会执行查询的实际执行。与此同时,节点可以自由地做任何想做的事情,直到数据库完成,并让节点知道有结果要提取。

您可以通过其结构识别异步操作:my_function(...,...,callback)。使用回调函数的函数在大多数情况下都是异步函数。

所以底线:不要担心阻塞IO的问题,因为你几乎不会遇到任何节点。如果需要,可以使用单个端口(通过创建多个子进程,您甚至可以在同一端口上拥有多个节点实例)。

希望这能解释得足够好。如果您有任何其他问题,请告诉我:))