Node.js垂直水平扩展与消息集成方案

如何调整Node内存限制 Node为什么会出现内存溢出,如何优化?如何调整Node内存限制? 阅读详情

这是一篇讨论Node.js在无需修改任何代码从单核垂直扩展到多核,再水平扩展到多台集群和消息集成的分布式系统,展示了Node.JS在无缝扩展性方面要强于Java。其主要架构是Node.js微服务 + 消息Messaging + 集群Clustering 。翻译如下:

当使用微服务创建一个复杂的分布式系统时,关键问题是提供服务之间的通信,微服务一般使用REST API,你一般会缓存远方的状态,但系统是在不断地变化,也许你状态已经过期了,你可以通过轮询刷新你的拷贝,但这是不可扩展的,增加系统压力,很多重复的请求通常反而得不到最新的状态( ‘不,还没有新的消息。别再重复问了。”)

更好的方式是反转信息流,让服务拥有数据当发生变化时主动告诉你。这是来自微服务为基础的消息系统,这需要某种消息代理。

另一个重要的特点是可扩展性Scalable。你可能需要迅速提高你的处理能力,垂直或水平伸缩扩展微服务能力是关键。

水平和垂直扩展
通常认为从Java迁移到Node.js的开发人员其实并不真正理解水平扩展的含义,因为在JEE容器中线程池实现了魔术的处理,增加真实或虚拟的服务器其实不需要软件这边做出什么修改,举例,如果你为你的JVM增加CPU核数,JEE容器会扩展利用它们,如果你增加更多内存,你就需要微调JVM参数才能充分利用扩大的内存,否则它像以往一样工作,这时你可能需要重新启动多个JVM, 在这点上你发现你的JEE应用实际并不是以集群方式编写的。

在Node.js这里,增加更多CPU核数其实也不难做到,使用PM2如下命令:

pm2 start app.js -i max
无论如何,对于Node.js水平或垂直扩展是不管你编写代码的方式,你只需要通过集群利用在同一台机器上所有CPU内核,不用像Java那样需要在多个独立的服务器或虚拟机实现负载均衡。

我真的喜欢Node.js这个特性–它迫使你从一开始就要考虑集群,阻止你在请求之间持有数据,迫使你存储状态到一个共享的数据库中,这个数据库能够被所有正在运行的实例访问。这使得从垂直到水平的扩展性切换,根本不影响你。这里没什么新的东西,只是基本的share-nothing的好处。

然而,使用PM2加载多个Node.js或使用Node的集群模块与使用Nginx代理作为负载平衡器之间是有重要区别的:使用Nginx 作为代理服务器时,我们有一个独立的绑定到一个机器上的一个端口服务器,负载平衡和URL代理同时已经完成。在Nginx中是这样配置:

http {
    upstream myapp1 {
        server srv1.example.com;
        server srv2.example.com;
        server srv3.example.com;
    }
 
    server {
        listen 80;
 
        location / {
            proxy_pass http://myapp1;
        }
    }
}

如果你试图在单台机器上启动多个Node服务器时,除了第一个都将失败,因为它们(srv1. srv2. srv3.)不能绑定到同一个80端口上,然而,如果你使用Node的集群模块或使用PM2,会有一点魔法发生,主进程有一段代码会激活Socket在多个工作进程之间共享,使用了一种共享策略(或者使用操作系统定义 或者Node 0.12的’round-robin’),这非常类似于Nginx在不同服务器之间为你做的事情,Nginx也有负载平衡的选项(round-robin, 最少连接, IP-hash, weight-directed重导向等).


消息
下面我们将消息和集群两个概念放在一起。
为了让事情变得更具体生动,让我们看一个真实世界的例子。我们已经编写的活动的流微服务。它的工作是收集活动流规范2草案中的活动,并将它们存储在cloudant数据库,这样它们以后可以作为一种活动流检索。这项微服务做一件事情,并且做得很好–它聚集来自系统任何地方的活动–然后发射一个活动到一个专用的MQTT主题。

我们使用mqtt作为MQTT客户端,RabbitMQ作为我们的多语种消息代理,Node.js作为我们的活动微服务,这已经是我们不止第一次这么架构了。

当前面谈的集群加入其中时,MQTT是一个pub/sub协议.为了让每个订阅者从队列中读取消息, RabbitMQ为集群中每个Node实例开设一个单独队列实例。




但这并不是我们需要的,每个实例都将收到一个“新活动”消息,并试图将它写入数据库,数据库这里需要避免竞争。即使数据库可以阻止其他Node保证只有一个Node节点成功写入记录,这也是一种浪费,因为所有的Node节点都在执行同一个任务。

这里的问题是,用于集群模块“白魔法”来处理HTTP / HTTPS服务器请求但并没有延伸到MQTT模块。

我们解决这个问题原始想法是,如果我们迁移消息客户端到主实例,它会对进来的消息响应,然后传递他们到后面的从工作实例,以round- robin方式,这似乎是合理的,但需要调整一个ICK参数,因为需要我们自己实施自己的负载平衡,它会阻止我们使用PM2(因为我们必须对从工作实例进行控制),如果我们使用多个虚拟机和Nginx的负载平衡,我们将回到原点(Nginx并不支持单机同一个端口的负载平衡)。

幸运的是,我们发现RabbitMQ已经可以处理这部分,如果我们放弃持久,并且确认我们是MQTT抽象下运行AMQP。RabbitMQ的pub / sub拓扑方式是:发布者提交到 “主题”交流,然后被绑定到一个使用路由作为Key的队列上(事实上,在AMQP路由key和MQTT主题topic有直接映射)。

原来使用MQTT客户端使得每个群集实例接收自己的队列。现在通过迁移到AMQP客户端和将所有实例绑定到同一个队列,我们让RabbitMQ对客户端使用round-robin实现基本负载平衡。




下面是使用Eclipse PAHO Java客户端发布MQTT消息给主题Topic代码,使用Node.js或•Ruby等其他客户端几乎一样:
public static final String TOPIC = "activities";
MqttClient client;
 
try {
    client = new MqttClient("tcp://"+host+":1883",
                                      "mqtt-client1");
    client.connect();
    MqttMessage message = new MqttMessage(messageText.getBytes());
    client.publish(TOPIC, message);
    System.out.println (" [x] Sent to MQTT topic '"
                              +TOPIC+"': "+ message + "'");
    client.disconnect();
} catch (MqttException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}

上面是发出消息到‘activities’主题,下面是接受消息,然后将队列使用匹配的路由key(还是‘activities’)和缺省的AMQP主题交换(topic exchange (“amq.topic”))绑定,队列的名称不重要,只要所有Node的服务器都使用同一个即可,实际上名称在它们之间会相互复制。

var amqp = require('amqp');
 
var connection = amqp.createConnection({ host: 'localhost' });
 
// Wait for connection to become established.
connection.on('ready', function () {
  // Use the default 'amq.topic' exchange
  connection.queue('worker-queue', { durable: true}, function (q) {
      // Route key identical to the MQTT topic
      q.bind('activities');
 
      // Receive messages
      q.subscribe(function (message, headers, deliveryInfo, messageObject) {
        // Print messages to stdout
        console.log('Node AMQP('+process.pid+'): received topic "'+
                deliveryInfo.routingKey+
                '", message: "'+
                message.data.toString ()+'"');
      });
  });
});

2、微服务与Node.js基础入门 本文介绍了微服务与Node.js的基础入门知识,涵盖了微服务架构和去中心化架构的核心概念,探讨了服务边界、松散耦合、独立开发与部署、多语言架构、可扩展性、弹性以及独立数据管理等关键主题。此外,还讨论了微服务中的API通信和持续集成的实践方法,为构建高效、可扩展和弹性的现代软件系统提供了理论基础和实践指导。 阅读详情

相关推荐

实现双向滑动表格的Node.js项目实战

在Android应用开发中,ListView是一个常用的组件,它允许用户在一个垂直滚动的列表中选择一个或多个项。它非常适合用于显示长列表数据,例如联系人列表、消息列表、歌曲列表等。ListView的特性包括:动态项内容显示:通过适配器模式(Adapter Pattern),ListView能够动态地将数据集合绑定到视图。滚动加载更多:用户可以滚动查看所有项,应用无需一次性加载全部数据。快速滚动。

weixin_31486261的博客 646

推荐项目:解决Node.js“内存溢出”的神器——increase-memory-limit

推荐项目:解决Node.js“内存溢出”的神器——increase-memory-limit 在Node.js应用开发过程中,尤其是当你的项目规模庞大、涉及复杂的编译过程(如TypeScript或大型Webpack构建)时,“JavaScript堆内存不足”的错误常常让人头疼不已。针对这一痛点,一个简洁而实用的开源解决方案出现了——increase-memory-limit。 项目介绍 incre...

gitblog_00630的博客 1358

FreeRadius详解.zip

freeradius包含对各种操作系统的支持以及安装,详细的介绍了它的工作原理及对其他服务的支持,如MySQL

NodeJS内存溢出解决办法

FATAL ERROR: Ineffective mark-compacts near heap limit Allocation failed - nodeJs打包时内存溢出 打开一个cmd窗口 运行setx NODE_OPTIONS --max_old_space_size=4096 关闭所有cmd /代码编辑器 重新打开cmd并再次运行节点命令(npm等) 转自https://...

weixin_41888177的博客 6878

FreeRadius数据表详解

FreeRadius MySQL数据的解释

FreeRadius源码分析之-radius.h

freeradius 主要核心入口是 radiusd,平常我们使用 radiusd -X 进行调试,其中与RFC相关系的包的封装及类型都在其他模块实现和定义。今天这里就讨论最重要的定义部分 radius.h。

nodejs 设置应用的内存上限 NODE_OPTIONS=--max-old-space-size=8192

文章目录NodeJS应用的内存上限该内存上限由谁决定?如何修改该内存上限?环境变量的修改方式Windows 仅当前窗口有效Windows 永久有效(仅用户级别)Windows 永久有效(系统级别)类unix系统(Linux/macOS)通用方式Others其他相关nodejs参数如何用命令行打开用户级别的环境变量编辑窗口? NodeJS应用的内存上限 该内存上限由谁决定? NodeJS启动的应用,内存使用是有上限的。 默认为4GB(不同机器环境可能会有不同)。 那么,如何自己指定这个内存上限呢(我机器配置足

wuyujin1997的博客 5万+

别再只用跳层连接了!手把手教你用DASI和MDCR模块提升红外小目标检测精度

本文详细介绍了如何利用DASI和MDCR模块提升红外小目标检测精度。通过分析传统跳层连接的缺陷,提出维度感知的特征选择性融合(DASI)和多尺度感受野精炼器(MDCR)的创新方案,显著提升小目标检测性能。实验证明,该方法在多个场景下AP@0.5提升达15.4%,特别适用于安防监控和遥感图像分析。

weixin_28715081的博客 224

Node 部署指南(一)

在过去的几年里,Node.js 已经进入到了财富 500 强公司的技术栈、以移动为先的初创公司、成功的互联网企业以及其他企业的技术栈中。除了验证其作为平台的力量外,这种成功也暴露了管理、部署和监控 Node.js 应用程序的工具短缺。尽管 Node.js 社区是开放和协作的,但关于专业 Node.js 开发者如何设计、测试并将代码推送到生产环境中的全面信息仍然难以找到。

龙哥盟 390

SAP FI实战入门:从借贷法则到F-02记账,新手必懂的会计凭证操作

本文详细介绍了SAP FI模块中借贷记账法的核心逻辑及F-02凭证录入的全流程操作。通过实例解析借贷方向规则、科目编码设置及金额镜像原则,帮助新手快速掌握会计凭证操作技巧。同时提供了FS10N余额查询和常见错误排查方法,助力用户高效完成SAP财务记账任务。

weixin_29306571的博客 263

蓝牙 - 如何在Windows下抓取蓝牙数据

选择Windows Instarller(64-bit),最好不要选择PortableApps版,因为后面需要通过btvs.exe来启动Wireshark,如果是绿色可移植版,会启动失败。在安装完以后,找到btvs.exe文件,位于路径:C:\BTP\v1.14.0\x86下,这个视安装版本不同路径名不同。在第一台机器上启动btvs.exe,第二台机器上手动启动wireshark,并将第一台机器的IP地址作为参数。1,同一机器上,Wireshark安装后,会自动直接启动,如上面使用方式一样。

guoqx的专栏 2万+

3个方案搞定Node.js面试中的分库分表难题:从理论到实战

Node.js面试中,分库分表是考察候选人数据库架构设计能力的高频难点。本文将从数据存储架构出发,结合ElemeFE面试考点,为你系统梳理分库分表的核心方案与实战技巧,帮你轻松应对面试挑战。 ## 为什么分库分表是Node.js面试必考点? 在高并发的Node.js应用中,随着用户规模增长,单库单表往往面临性能瓶颈。以电商场景为例,订单表可能在数月内达到千万级数据量,导致查询缓慢、写入阻塞。分

gitblog_00229的博客 604

MCP详解:手把手教你理解和如何使用各种开源MCP服务

MCP 作为一种开放协议,为 AI 模型与外部世界的连接提供了标准化的解决方案。它不仅降低了开发门槛,还极大地扩展了 AI 应用的边界。无论是开发者还是普通用户,都可以通过 MCP 更高效地利用 AI 技术,实现更多智能化的功能。

王哥儿聊AI的博客 6056

深入理解fullstack-javascript-architecture的微服务架构:如何构建可扩展的JavaScript应用

在当今快速发展的Web开发领域,构建可扩展、可维护的全栈JavaScript应用是每个开发者的追求。**fullstack-javascript-architecture**提供了一个完整的微服务架构解决方案,帮助开发者快速构建现代化的全栈应用。这个架构基于微服务设计理念,通过容器化部署和模块化设计,让JavaScript应用开发变得更加简单高效。 ## 🏗️ 什么是微服务架构? 微服务架构

gitblog_00331的博客 399

AutoModelForCausalLM 加载失败:flash_attn 缺失的三种解决方案

本文针对使用AutoModelForCausalLM加载大语言模型时因缺失flash_attn依赖而报错的问题,提供了三种实用解决方案。最推荐通过修改模型配置文件或代码动态指定注意力实现为“eager”模式来绕过检查,也介绍了临时修改库源码的应急方法,并解释了flash_attn的作用及正确安装指南。

html8的博客 269

Java 大视界 -- 基于 Java+Flink 构建实时电商交易风控系统实战(436)

本文介绍基于Java+Flink构建实时电商交易风控系统的实战经验。系统采用分层架构设计,包含数据采集层、实时计算层、规则引擎层、数据存储层和应用服务层,实现毫秒级风险识别与拦截。核心组件包括Flink 1.17处理交易数据流、Drools规则引擎动态匹配风险规则、Redis缓存热点数据等。文章详细提供了开发环境配置清单和Maven依赖说明,确保系统具备低延迟(≤200ms)、高吞吐(10万TPS)和高可用性(99.99%)特性。该方案已通过生产环境验证,可有效应对恶意刷单、盗刷支付等电商交易风险。

【青云交】华为云云享专家 | 阿里云开发者社区专家博主 技术圈个人影响力前 9 | 博客之星 TOP12 优快云 首位四榜(原力榜 / 作者周榜 / 领军人物 / 综合热榜)榜首,破平台纪录! 苏州地区全榜霸榜,感恩全网十多万粉丝同行! 3942

YOLO12与Node.js集成:构建实时目标检测API服务

本文介绍了如何在星图GPU平台上自动化部署YOLO12 实时目标检测模型 V1.0镜像,以快速构建实时目标检测API服务。该方案结合了YOLO12的高精度与Node.js的高并发处理能力,典型应用于智能安防监控场景,可实时分析视频流并识别目标。

weixin_42611177的博客 38

腾讯微搭低代码开发实战电子书:医疗挂号小程序

本书通过一个完整的“医疗挂号小程序”项目,深度讲解腾讯微搭(WeDa)低代码平台在复杂业务场景下的实战应用。从登录体系搭建、用户注册,到就诊人管理、科室排班与预约下单,全程遵循“配置+逻辑+实战”的思路,带领读者从零实现具备商业级可用性的医疗挂号小程序,掌握低代码开发的核心技巧与业务落地能力。

低代码布道师的博客 954

Node-chat性能优化:高并发聊天室架构设计与实现终极指南

在构建现代实时聊天应用时,性能优化是确保用户体验流畅的关键。Node-chat作为一款基于Node.js和Material Design的聊天应用,在面对高并发场景时需要进行专门的架构优化。本文将深入探讨如何通过架构设计和性能优化技术,让您的聊天室应用能够轻松应对数千用户同时在线的挑战。 ## 🚀 为什么需要性能优化? Node-chat默认配置虽然功能完善,但在高并发场景下可能会遇到瓶颈。

gitblog_01114的博客 955

学Simulink--基于新能源与储能系统的场景实例:压缩空气储能(CAES)系统热力学建模

本文介绍了使用Simulink对压缩空气储能(CAES)系统进行热力学建模的详细流程。重点讲解了系统各模块的设计方法,包括压缩机、储气装置、膨胀机和热交换器等核心组件的参数设置与计算模型。文章还提供了控制策略设计和仿真运行的具体步骤,通过建立MATLAB函数计算关键参数变化,并分析了系统性能评估指标。该建模方法可用于验证CAES系统的设计有效性,并为优化储能效率提供技术参考。全文采用模块化设计思路,为新能源与储能系统的仿真研究提供了实用案例。

xiaoheshang_123的博客 298

复分析 阿尔福斯(Ahlfors) 第三版答案 英文

答案分为十章,有部分习题没有答案,全英文复分析阿尔福斯(Ahlfors) 第三版答案

学习node.js 四 ffmpeg,events,util

FFmpeg全称为Fast Forward Moving Picture Experts Group,于2000年诞生,是一款免费,开源的音视频编解码工具及开发套件。核心 API 都是采用异步事件驱动架构,简单来说就是通过有效的方法来监听事件状态的变化,并在变化的时候做出相应的动作。在events里,说过,node.js 核心 API 都是采用异步事件驱动架构,遵循回调的模式去写的。FFmpeg 本身是一个庞大的项目,包含许多组件和库文件,最常用的是它的命令行工具。里会有三个exe文件,复制此时的地址。

tian_liang_jia的博客 1115

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

Astroluma高级部署方案:生产环境配置与性能优化终极指南

Astroluma是一款功能丰富的自托管家庭实验室仪表板,基于MERN技术栈构建,专为高效管理日常任务和服务而设计。本文将为您提供完整的Astroluma生产环境部署方案与性能优化指南,帮助您构建稳定、高效的企业级仪表板系统。 ## 📊 为什么需要专业部署方案? 在开发环境中,Astroluma可以快速启动并运行,但在生产环境中,您需要考虑稳定性、安全性、性能和可扩展性。专业的部署方案能够确

gitblog_00864的博客 605

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

终极指南:如何快速掌握Rocket.Chat基于Node.js的微服务架构设计

Rocket.Chat是一款以数据保护为核心的通信平台,其后端服务采用Node.js构建的微服务架构,为企业提供安全、可扩展的实时通信解决方案。本文将深入解析Rocket.Chat后端服务的微服务架构设计,帮助新手和普通用户快速理解其核心原理和实现方式。 [![Rocket.Chat微服务架构示意图](https://raw.gitcode.com/GitHub_Trending/ro/Rock

gitblog_00316的博客 1090

【Node.js架构进阶指南】:3步搞定多数据源统一API输出

掌握Node.js多模型API融合技巧,3步实现多数据源统一输出。适用于微服务、前后端分离等场景,通过抽象层设计、路由聚合与数据格式标准化,提升系统灵活性与可维护性。方法实用高效,值得收藏。

DevPath的博客 683

Colyseus:Node.js权威多人游戏框架深度解析

Colyseus:Node.js权威多人游戏框架深度解析 Colyseus是一个专为Node.js设计的权威多人游戏框架,通过WebSocket协议提供实时通信能力,专注于为实时和回合制游戏提供可同步的数据结构、匹配系统以及简化的服务器端和客户端使用体验。本文将从框架概述、核心特性、架构设计原理、状态同步机制和多平台SDK支持等方面进行深度解析。 Colyseus框架概述与核心特性 Colyseu...

gitblog_01141的博客 595

企业级Node.js API设计秘籍(多模型融合架构落地实录)

掌握企业级Node.js多模型API融合设计,解决复杂业务场景下的系统集成难题。通过统一接口层整合关系型、文档型与图数据库模型,提升数据交互效率与架构灵活性。详解中间件封装、服务解耦与性能优化实践,适用于高并发微服务架构。值得收藏的落地实录,点击了解实现细节。

LiteCode的博客 663
上一篇: flazr针对rtmp进行批量直播测试
下一篇: 标准C++类std::string的内存共享和Copy-On-Write技术
mergerly
博客等级 码龄22年 953粉丝 80原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值