我有一百万恐龙用户都登录了。
Dinosaurs 希望看到其他 Dinosaurs 何时实时更新它们的配置文件,因此它们被挂接到 NodeJS/Mongoose 模型中,如下所示:
dinosaur.schema.post('save', function (doc) {
socket.emit('恐龙:保存',文档);
});
其中 socket 是连接的 Dinosaur 的套接字。
恐龙还将看到来自其他几个事物的实时更新。也许是新闻、评论等等。
那么,我的问题是,在某些情况下,这种事件的发出会变得越来越大并影响性能吗?
在客户端,我会有类似 socket.on('dinosaur:save', function(){}) 的东西……我会在不需要时销毁监听器。但是,如果我正在收听每一个 dinosaur:save,理论上我可以每秒处理一百万次保存(假设每只恐龙都在同一秒内更新它们的配置文件)。似乎有更好的方法来处理大型数据集。
我想我可能还想观看其他几个事件,我只是想知道是否有一些推荐的方法用于这种套接字管理。
编辑:明确地说,我知道房间,但如果我,例如,有一个我所在地区附近所有恐龙的滚动列表,我可能只想连接到接收所有 恐龙:save 事件。所以我还是不确定。
最佳答案
通知一百万个数据包是很多数据包,如果您要通知的事情经常发生,那就是很多,而且尝试在屏幕上显示的数量甚至更多。
通常首先要考虑的是:
这些通知的实时性到底有多高?您能否在每个通知周期内将 60 秒或更长时间的通知批量打包到每个用户的一个数据包中?
是否真的每个用户都必须看到每个其他用户的每一个更改。您知道任何用户界面都绝对不可能呈现一百万其他用户的状态。所以,我认为每个用户都不必知道每个其他用户的状态。如果有 1-50 个其他用户,也许可以,但如果有 100 万,就不行了。
您能否通过算法确定给定用户可能对哪些用户状态感兴趣并只向他们广播。例如,您能否仅让他们了解地理位置靠近他们的其他用户的最新信息?
您能否拥有一个用户界面,让用户告诉您他们想要跟踪哪些其他用户,以便您只更新这些用户?或者可能是他们告诉您的用户和他们在地理上对他们感兴趣的用户的某种组合。关键是您无论如何也看不到 100 万用户,因此您将不得不发明一个 UI,无论如何显示的数量都比这少得多。
如果客户端还没有其他用户的状态,您始终可以拥有一个可以根据需要获取其他用户状态的 UI,这样您就不必为每个客户端中的所有百万用户保留状态(因为无论如何不可能一次全部显示)。如果用户浏览并查看一些他们还没有的东西,您只需通过套接字或 ajax 调用从服务器获取它。
哦,按照您所说的规模,您可能需要将用户的连接分布在多个服务器上,因此您也必须处理这种复杂性。
关于javascript - NodeJS + SocketIO 大套接字事件管理,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27371554/
我正在使用i18n从头开始构建一个多语言网络应用程序,虽然我自己可以处理一大堆yml文件,但我说的语言(非常)有限,最终我想寻求外部帮助帮助。我想知道这里是否有人在使用UI插件/gem(与django上的django-rosetta不同)来处理多个翻译器,其中一些翻译器不愿意或无法处理存储库中的100多个文件,处理语言数据。谢谢&问候,安德拉斯(如果您已经在rubyonrails-talk上遇到了这个问题,我们深表歉意) 最佳答案 有一个rails3branchofthetolkgem在github上。您可以通过在Gemfi
我的瘦服务器配置了nginx,我的ROR应用程序正在它们上运行。在我发布代码更新时运行thinrestart会给我的应用程序带来一些停机时间。我试图弄清楚如何优雅地重启正在运行的Thin实例,但找不到好的解决方案。有没有人能做到这一点? 最佳答案 #Restartjustthethinserverdescribedbythatconfigsudothin-C/etc/thin/mysite.ymlrestartNginx将继续运行并代理请求。如果您将Nginx设置为使用多个上游服务器,例如server{listen80;server
我安装了ruby版本管理器,并将RVM安装的ruby实现设置为默认值,这样'哪个ruby'显示'~/.rvm/ruby-1.8.6-p383/bin/ruby'但是当我在emacs中打开inf-ruby缓冲区时,它使用安装在/usr/bin中的ruby。有没有办法让emacs像shell一样尊重ruby的路径?谢谢! 最佳答案 我创建了一个emacs扩展来将rvm集成到emacs中。如果您有兴趣,可以在这里获取:http://github.com/senny/rvm.el
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
如何将send与+=一起使用?a=20;a.send"+=",10undefinedmethod`+='for20:Fixnuma=20;a+=10=>30 最佳答案 恐怕你不能。+=不是方法,而是语法糖。参见http://www.ruby-doc.org/docs/ProgrammingRuby/html/tut_expressions.html它说Incommonwithmanyotherlanguages,Rubyhasasyntacticshortcut:a=a+2maybewrittenasa+=2.你能做的最好的事情是:
网络编程套接字网络编程基础知识理解源`IP`地址和目的`IP`地址理解源MAC地址和目的MAC地址认识端口号理解端口号和进程ID理解源端口号和目的端口号认识`TCP`协议认识`UDP`协议网络字节序socket编程接口`sockaddr``UDP`网络程序服务器端代码逻辑:需要用到的接口服务器端代码`udp`客户端代码逻辑`udp`客户端代码`TCP`网络程序服务器代码逻辑多个版本服务器单进程版本多进程版本多线程版本线程池版本服务器端代码客户端代码逻辑客户端代码TCP协议通讯流程TCP协议的客户端/服务器程序流程三次握手(建立连接)数据传输四次挥手(断开连接)TCP和UDP对比网络编程基础知识
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
s=Socket.new(Socket::AF_INET,Socket::SOCK_STREAM,0)s.connect(Socket.pack_sockaddr_in('port','hostname'))ssl=OpenSSL::SSL::SSLSocket.new(s,sslcert)ssl.connect从这里开始,如果ssl连接和底层套接字仍然是ESTABLISHED,或者它是否在默认值7200之后进入CLOSE_WAIT,我想检查一个线程几秒钟甚至更糟的是在实际上不需要.write()或.read()的情况下关闭。是用select()、IO.select()还是其他方法完成
我想用这两种语言中的任何一种(最好是ruby)制作一个窗口管理器。老实说,除了我需要加载某种X模块外,我不知道从哪里开始。因此,如果有人有线索,如果您能指出正确的方向,那就太好了。谢谢 最佳答案 XCB,X的下一代API使用XML格式定义X协议(protocol),并使用脚本生成特定语言绑定(bind)。它在概念上与SWIG类似,只是它描述的不是CAPI,而是X协议(protocol)。目前,C和Python存在绑定(bind)。理论上,Ruby端口只是编写一个从XML协议(protocol)定义语言到Ruby的翻译器的问题。生