V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
• 请不要在回答技术问题时复制粘贴 AI 生成的内容
rizon
V2EX  ›  程序员

nodejs 使用 pm2 启动集群模式,全局变量怎么共享?

  •  
  •   rizon ·
    othorizon · 2019-06-11 18:23:53 +08:00 · 4313 次点击
    这是一个创建于 2027 天前的主题,其中的信息可能已经有所发展或是发生改变。

    nodejs 写了一个 map 做内存缓存,但是使用 pm2 启动集群模式,就会导致每个都有自己的 map 缓存,
    这就导致数据不一致了,这怎么解决?

    第 1 条附言  ·  2019-06-11 22:33:57 +08:00
    或者有没有更轻便的全局共享的方案? redis 太大了,太占内存了。也太重了,我就是一个很小需求点。
    比如写文件或者其他的方式。
    第 2 条附言  ·  2019-06-11 22:46:27 +08:00
    打算用 memcache 了,感觉这个比 redis 更轻量一些吧? 项目是 nodejs 的
    第 3 条附言  ·  2019-06-12 02:08:55 +08:00
    已经上 memcached 了,docker 版初始化内存占用 2-3m。目前感觉良好,功能确实很少。
    20 条回复    2019-06-12 10:30:22 +08:00
    90928yao
        1
    90928yao  
       2019-06-11 18:27:17 +08:00
    redis 发布订阅 http 接口通知
    rizon
        2
    rizon  
    OP
       2019-06-11 18:41:09 +08:00
    @90928yao #1 太麻烦了,不想上中间件
    WittBulter
        3
    WittBulter  
       2019-06-11 18:48:02 +08:00
    集群模式每个都是独立的,应该没有状态共享,否则就 **不应该** 用集群模式。(业务应该用 redis 等第三方的共享状态)
    如果你强行要这么做,可以用 rpc 通信,参考 dnode 项目。
    yixiang
        4
    yixiang  
       2019-06-11 18:48:59 +08:00
    改用 cluster 然后互传信息。

    或者内存映射一部分到磁盘,缓存写入这个磁盘里一个 json 文件。

    上 redis 或类似的玩意其实是最简单直接的。
    chenqh
        5
    chenqh  
       2019-06-11 19:36:33 +08:00
    还是 redis 把,简单粗暴
    rizon
        6
    rizon  
    OP
       2019-06-11 21:07:20 +08:00
    @WittBulter #3
    @yixiang #4
    @chenqh #5
    1g 内存的机器不够用了快。
    那我换个思路,有没有办法让指定链接的请求固定只走集群中的一个节点?
    因为我只是对其中一个特定的请求做了缓存,所以这个请求可以有办法让他固定只走一个节点吗?
    yangg
        7
    yangg  
       2019-06-11 21:11:05 +08:00 via iPhone
    Haproxy 这样就用不了集群模式了
    guagusi
        8
    guagusi  
       2019-06-11 21:30:39 +08:00
    @rizon Nginx 七层负载均衡
    runtu2019
        9
    runtu2019  
       2019-06-11 21:44:37 +08:00
    写个配置文件或者数据库保存集群主机的 ip 地址或者访问地址,明确哪台机器为主是可以写的

    写个 json 接口,可以读取缓存内容和提交缓存内容
    更新缓存的是时候,根据配置文件访问接口提交到可以写的主机内
    其他的主机根据配置文件的 ip 和接口做定时同步,同时这个动作可以作为心跳检查,接口获取不了就切换主机

    但是你这么做不觉得累的慌吗,redis 不好吗
    rizon
        10
    rizon  
    OP
       2019-06-11 22:25:19 +08:00
    @runtu2019 #9 我是一台机器,使用 pm2 开的 nodejs 的 cluster 模式,所以 ip 和端口号是同一个。我想要明确的调用其中一个是不是做不到?
    jybox
        11
    jybox  
       2019-06-11 22:35:23 +08:00
    Redis 本身也就 10M 内存,而且集中在 Redis 而不是每个进程存一份的话,应该是更省内存的。
    rizon
        12
    rizon  
    OP
       2019-06-11 22:41:42 +08:00
    @jybox #11 看了下 memcache 这个不是比 redis 还要轻便一些?
    jybox
        13
    jybox  
       2019-06-11 22:47:31 +08:00
    确实,但我还是更推荐 Reids,功能多太多了
    version
        14
    version  
       2019-06-11 22:52:45 +08:00 via iPhone
    优先选择 redis,没数据也占用 10m 内存都不到,pm2 集群部署不就是多进程,只能用第三方来处理,而且 1 核的主机开集群,真的会比之前快么,楼主应该不是后端开发吧
    gzlock
        15
    gzlock  
       2019-06-11 22:54:22 +08:00
    用文本文件(json)或者 sqlite 就可以了啊
    kawana
        16
    kawana  
       2019-06-11 22:56:37 +08:00
    > 有没有办法让指定链接的请求固定只走集群中的一个节点

    可以了解一下 nginx 的负载均衡用 **一致性哈希**
    joouis
        17
    joouis  
       2019-06-11 23:32:04 +08:00 via Android
    RPC 或 Redis 吧
    rizon
        18
    rizon  
    OP
       2019-06-12 02:08:08 +08:00
    @version #14 我是后端开发哈,单点开集群的作用似乎是没啥用。。。。算是为以后多点部署做准备吧。。。
    已经换了 memcache 了,docker 版,初始化内存占用 2-3m。就是个分布式共享,memcache 足够了。
    sunmonster
        19
    sunmonster  
       2019-06-12 08:49:01 +08:00
    现在所谓的轻量级和重量级都是按功能算的吗。。。
    rizon
        20
    rizon  
    OP
       2019-06-12 10:30:22 +08:00
    @sunmonster #19 哈哈 本人小白,不专业,见笑哈。这东西应该怎么判断?
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1184 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 18:18 · PVG 02:18 · LAX 10:18 · JFK 13:18
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.