业务场景大概如下:
server A上需要开启10个左右的node进程. 每个进程需要从MongoDB/Redis读取一系列得数据,大概在1MB左右. 此数据可以缓存30mins左右. 但是如果10个进程都去MongoDB/Redis获取,无疑增加MongoDB/Redis的负担. 而且对网络流量损耗也比较大.
请教是否有什么方案,可以在这些缓存数据在10个进程中共享,而无需每次都访问 MongoDB/Redis.
补充下,业务需要支持>1kw/day的请求
你要缓存的数据量并不大,每个进程各自缓存一份自己的数据就可以。
抱歉,忘记说明了,我在原文补充了下,需要支撑最少>1kw/day的请求,如果每个进程都缓存一份会导致内存占用过大.所以才提出了这个问题,请教关于进程间的共享缓存
@zeroxenof 我知道我有点答非所问。但是node不像php那样每个请求都要开一个进程,内存占用和请求数无关。你说只需要开启10个左右的node进程,你说每个进程1M左右的话,10个进程也就10M。
@imzshh 以正常目前的业务场景来说(非nodejs),一个进程平均是用1.5-3G内存不等.缓存是根据某些特定条件组合生成的key(key的数量稍微有点儿多),需要从MongoDB/Redis读取数据.
1MB的数据是业务数据传输量最大的那种,不是只有这种业务.
场景可以假设为,获取用户的一些浏览记录,包含图片,描述,评测等(描述与评价都算是比较大的传输量的数据),每次获取30条左右.然后再乘以一定的用户在线数量,这个缓存数据是比较庞大的.先不考虑这个架构是否可以优化.
发这个主题的原因只是想了解到nodejs有没有什么成熟方案可以共享进程间的数据
比如 用户X,访问站点时,被调度系统分配给A进程获取了luby的浏览历史,A进程从mongodb获取到luby的记录列表进行呈现.这时候用户Y也想看看luby的浏览历史,这调度系统分配给了B进程.这个时候B进程又要再去mongodb获取一次.
我期望是B进程可以共享A进程的luby记录列表 1)降低mongogdb的访问频率 2)提高响应速度,因为减少了mongodb查询,减少了网络传输.
不知道我这样描述是否准确 :)
多进程共享缓存或多机共享缓存,无疑需要使用redis之类的内存缓存。 jsGen以前使用Node.js内存缓存数据,不能开多进程,现在全改成redis缓存了,从而可以多进程或多机运行jsGen了。 redis是异步驱动,写起代码来还是有点啰嗦,不过对于小数据缓存,还是有办法实现一个同步的redis缓存。jsGen的config数据就是用的这种redis同步缓存,稍后出文讲讲这个实现。
其实我需要寻求的是一个单机的,进程中数据的共享方案. 使用外部缓存(redis/memcached/mongo等等都可以胜任)最大的问题,是需要多一次网络传输. 性能上损耗还是比较大的,哪怕是异步的方式.
我想尽量避免开这些损耗,想了解是否nodejs有单机进程间的数据共享方案
-
如果要共享内存,可以试试node-shm模块;如果对速度的要求没那么快,可以试试node-easy-ipc。两个模块的区别就是shared memory vs. unix domain socket。
-
详细的讨论(墙外链接):如何在node.js中共享内存
@bnuhero 感谢,晚上去回去好好看下:)
@zeroxenof 不知道你现在这个问题找到解决方案了吗?最近也遇到了相同的问题。
@zeroxenof 在单机中共享数据,仅仅使用process的send message不行吗? 缓存放在主进程中,工作进程都由主进程fork出来
俺是新手,做个假设,不知可否。如果数据不大,当子进程A被分配去读取数据时,先判断内存中是否已经存在这些数据,如果不存在则读取数据,然后将读取到的数据传递给主进程,主进程将其保存在内存中,以便后面的子进程进行前面说的判断。