我面临的设计问题是,我希望减少API服务器的延迟,因为它根据传递的参数对请求的文件进行一些繁重的处理。
此服务器需要向许多http客户端提供处理过的文件。请注意,这些动态内容是原始文件名和其他参数的结果。在任何时间点,对于许多http客户端,原始文件名和其他参数都可能完全匹配。因此,为了节省冗余,这个处理必须精确地完成一次。
我目前正在使用基于Redis的分布式锁来实现这一点。
现在,为了降低带宽成本,我处理这些文件并将它们上传到CDN。并最终将经过处理的最终-URL重定向请求传递给所有感兴趣的各方,即http客户端。
基于一些阅读,我发现nsq.io可以通过为每个文件和params的唯一组合创建动态主题来解决这个问题。但是http客户端将如何以非阻塞的方式使用结果。请注意,我对HTTP客户端没有任何控制,也就是说,我不能更改客户端的任何内容来解决这个问题。
发布于 2015-08-23 21:26:25
我不知道你是怎么用锁的。
我会这么做,
1. check redis for (file, params) (see if already processed)
1.1 if not check redis for (processing - file, params) (see if processing)
1.1.1 if so, wait for (file, params)
1.1.2 if not, put (processing -file, params) and start making the (file, params) result
(因为这是非原子的,您可以在“时间”窗口中多次处理,但可能比常量锁定/解锁更好,我认为重要的想法是,您希望为每个资源实现“锁”概念,以便对不同请求的请求不必获得锁。)
1.2 if so, serve the contents
阻塞/非阻塞是您在服务器端应用的内容,客户端与此无关。
使您的服务器套接字(操作)非阻塞。
如何做到这一点取决于您为服务器使用的框架/库。
现在我看到您在使用node.js,node.js不是已经使用非阻塞套接字了吗?
https://stackoverflow.com/questions/31997099
复制相似问题