浏览 1.4k
想在2个进程之间共享复杂的数据结构, 类似一个大json, 但需要针对某个字段修改,
目前勉强用把json-encode之后的字符串放到shared-dict里. 但效率不太高(主要是json-encode/decode)
有其他什么替代方案吗? 主要是在lua脚本里访问.
按点赞数排序
按时间排序
shared-dict(https://github.com/openresty/lua-nginx-module#lua_shared_dict)底层是用nginx slab管理的,每个块必须是序列化好的连续内存,所以复杂数据结构都需要做序列化处理。但json毫无疑问序列化速度是最慢的,你可以选用更快的序列化方案,比如protobuf
3
回答于2020-12-07 19:06
用 Openresty 的 shared-dict 比较方便,而且效率非常高,线上目前用的也是这个。
如果只是修改部分字段,可以考虑把字段拆分,
3
回答于2020-05-20 16:06
1. 理论上 nginx 可以通过一些手段不用 gunicorn 这玩意。
2. 计算机世界里面的多一层的解决方案,都是是为了好管理,是为了职责清晰。
3. 某个场景下可以,不代表这个场景下这么做就好。比如,你可以去搬砖,但你没必要去搬砖,甚至说,你搬砖水平不如专业搬砖的。
举几个例子
1. 僧多粥少。nginx 可以上万并发,而正常的 python server 根本不够这么多并发。那么很简单,把nginx作为负载均衡,雨露均沾的分配请求到这些web服务器上。如果直接部署。则是把这些东西耦合在一起。没法scale。
2. 让专业的去做专业的事情。gunicorn有很多worker的姿势,比如支持 sync worker,gevent worker,比如tornado worker。nginx 如果全都支持,那岂不是要累死nginx团队?
3. 精准控制,比如gunicorn的sync worker是支持prefork,这也就意味着可以在收到足够多的请求的时候,预先帮你提升worker数量,来处理。比如,gunicorn 进程的用户可能和nginx不一样,具备更高的权限,你用nginx处理,是不是就有点简单粗暴了呢?再比如,我要针对wsgi做一些监控。这怎么处理?
依据HTTP方法、cookie、缓存、资源类型(内容协商中的各要素)、安全策略(如同源策略、CSP、CSRF)等因素的不同,头部会有差别。挺复杂的,因为HTTP几乎要解决互联网中产生的所有问题,所以要具体问题具体分析,看看你到底关心的是哪些HTTP头部了