小编Mat*_*dan的帖子

Pusher vs Pubnub vs开源Socket.io/SignalR.net/Faye/jWebSocket

我正在评估Pusher和PubNub,以便在我的主要Web客户端和我的服务器之间实现双向实时通信.两者看起来都令人印象深刻,Pusher的文档看起来更好,而PubNub的可扩展性和可靠性显然是他们的强项.

但是,由于我正在管理预算,我担心Pusher和PubNub的成本可能会成为我们的问题,因此我正在考虑使用其中一个开源替代品 - 我主要关注的是Socket.io,Faye和jWebSocket.

尽管我自己运行服务,但我有自己的顾虑:

  • 有没有人之前实际上将Socket.io或其他开源解决方案扩展到多个服务器?PubNub声称每秒处理1M消息!,我有点怀疑Socket.io可以做到这一点,没有一个不可思议的服务器数量,如果它可以工作.
  • 如果我使用开源解决方案,我可能会错过付费服务中的功能吗?
  • 如果我在AWS上拥有我的服务器,延迟真的会成为一个问题吗?PubNub位于多个位置,所以我希望这可以减少延迟,尽管如果需要从美国发送消息到日本,在日本拥有服务器将无助于延迟,因为它仍然需要以某种方式在那里旅行.

感谢您的建议.

signals websocket socket.io pubnub ably-realtime

71
推荐指数
1
解决办法
3万
查看次数

Ruby 2.1与Ruby 2.0或1.9相比内存使用量增加

我最近在我的Heroku Web应用程序中部署了从2.0升级到2.1.5的Ruby,我现在一直在调整内存配额错误,而2.0和1.9这种情况从未发生过.普通Heroku Dyno的限制为512MB,我使用Unicorn运行2个进程,并且在两个dynos上运行Sidekiq的一个线程.

Ubuntu上读取Phusion Passenger内存消耗从1.9.3(系统)增加到2.1.2(RVM)后,我尝试将环境变量设置RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR为0.9以禁用分代垃圾收集器,它确实在一定程度上改善了内存消耗,但仍然让我失望无处接近消耗的2.0或1.9.由于现在的内存是我最关心的问题,我想看看我是否可以使用ruby 2.1.x修复此问题,而不是恢复到2.0.

以下是一些演示此问题的图表:

在凌晨2点之前,我将Ruby 2.0.0-p598降级为Ruby 2.1.5,内存问题得到了解决,并且仍然处于极限之下.

从2.1.5移动到2.0.0 Heroku 从2.1.5移动到2.0.0 New Relic

然后,我尝试升级到Ruby 2.1.5,但将环境变量设置RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR为0.9.如您所见,内存使用情况略好于原始的2.1.5图表,但仍然违反了内存配额.

使用<code> RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR </ code>从2.0.0移动到2.1.5到0.9 Heroku 使用<code> RUBY_GC_HEAP_OLDOBJECT_LIMIT_FACTOR </ code>从2.0.0移动到2.1.5到0.9 New Relic

ruby memory ruby-on-rails heroku ruby-2.1

16
推荐指数
2
解决办法
3315
查看次数

Backbone.js - 在上一次保存之前保存模型时出现问题POST(创建)而不是PUT(更新)请求

我使用Backbone.js开发了一个很好的丰富的应用程序界面,用户可以非常快速地添加对象,然后通过简单地选项到相关字段来开始更新这些对象的属性.我遇到的问题是,有时用户将服务器击败到其初始保存,我们最终保存了两个对象.

如何重新创建此问题的示例如下:

  1. 用户单击添加人员按钮,我们将其添加到DOM但不保存任何内容,因为我们还没有任何数据.

    person = new Person();

  2. 用户在"名称"字段中输入一个值,并从中输出选项卡(名称字段失去焦点).这会触发保存,以便我们更新服务器上的模型.由于模型是新的,Backbone.js将自动向服务器发出POST(创建)请求.

    person.set ({ name: 'John' });

    person.save(); // create new model

  3. 然后,用户可以非常快速地键入他们已选中的年龄字段,输入20并将标签输入到下一个字段(因此年龄失去焦点).这再次触发保存,以便我们更新服务器上的模型.

    person.set ({ age: 20 });

    person.save(); // update the model

因此,在这种情况下,我们期望一个POST请求创建模型,一个PUT请求更新模型.

但是,如果第一个请求仍在处理中,并且我们在上面第3点的代码运行之前没有响应,那么我们实际获得的是两个POST请求,因此创建了两个对象而不是一个.

所以我的问题是,是否有一些最佳实践方法来处理这个问题和Backbone.js?或者,Backbone.js是否应该有一个用于保存操作的排队系统,以便在该对象的上一个请求成功/失败之前不会发送一个请求?或者,或者我应该通过仅发送一个创建请求而不是多个更新请求来构建一些优雅地处理它的东西,可能使用某种类型的限制,或者检查Backbone模型是否在请求的中间并等待该请求是完成.

您对如何处理此问题的建议将不胜感激.

我很高兴能够实现某种排队系统,尽管你可能需要忍受我的代码,这些代码不会像现有的代码库一样好!

javascript ajax backbone.js

15
推荐指数
2
解决办法
9764
查看次数

经济高效地终止大量SSL连接

我最近建立了一个基于Node.js的Web套接字服务器,该服务器已经过测试,可以在一个小的EC2实例(m1.small)上每秒处理大约2,000个新的连接请求.考虑到m1.small实例的成本,以及将多个实例放在支持WebSocket的代理服务器(如HAProxy)后面的能力,我们对结果非常满意.

但是,我们意识到我们尚未使用SSL进行任何测试,因此研究了许多SSL选项.很明显,终止代理服务器上的SSL连接是理想的,因为代理服务器可以检查流量并插入诸如X-Forward-For之类的标头,以便服务器知道请求来自哪个IP.

所以我研究了许多解决方案,如Pound,stunnel和stud,所有这些解决方案都允许终止443上的传入连接,然后传递到端口80上的HAProxy,然后将连接传递到Web服务器上.然而不幸的是,我发现在c1.medium(高CPU)实例上向SSL终止代理服务器发送流量非常快速地消耗了所有CPU资源,并且仅以每秒50个左右的请求速率消耗.我尝试使用上面列出的所有三个解决方案,并且所有这些解决方案的表现大致相同,我认为它们都依赖于OpenSSL.我尝试使用64位非常大的高CPU实例(c1.xlarge),发现性能只能随成本线性增长.因此,基于EC2定价,我需要为每秒200个SSL请求支付大约600美元/手,而不是每秒2,000个非SSL请求60美元/米.当我们开始计划每秒接受1,000或10,000个请求时,前一个价格在很快就变得经济上不可行.

我也尝试使用Node.js的https服务器终止SSL,性能与Pound,stunnel和stud非常相似,所以没有明显的优势.

因此,我希望有人可以提供帮助,建议我如何克服这个荒谬的成本,我们必须吸收提供SSL连接.我听说SSL硬件加速器提供了更好的性能,因为硬件设计用于SSL加密和解密,但由于我们目前正在为所有服务器使用Amazon EC2,因此除非我们有单独的数据,否则不能使用SSL硬件加速器以物理服务器为中心.我只是在努力想知道亚马逊,谷歌,Facebook等公司如何能够通过SSL提供所有流量,而其成本如此之高.那里必须有更好的解决方案.

任何建议或想法将不胜感激.

谢谢马特

ssl openssl haproxy stunnel node.js

13
推荐指数
2
解决办法
5228
查看次数

Javascript测试模拟JQuery UI可排序列表的拖动

我正在尝试编写一些前端Javascript测试,可以测试我在我的Web应用程序中使用的JQuery UI可排序列表的拖放功能.但是,我遇到了一个问题,即JQuery UI可排序列表似乎没有响应模拟鼠标事件.

我尝试了很多技术来测试它,但最后我找到了JQuery自己的模拟插件,似乎提供了我需要的功能.但是,当我运行模拟时,可排序列表不响应拖动事件,但其他组件(如Draggable)会响应.

通过我放在一起的简单拖曳模拟示例,可以很容易地证明这一点.在这个例子中,我嵌入了jquery.simulate插件,但修改了拖动功能以减慢它正在触发的事件,以便您可以直观地看到发生了什么.正如您将看到的,模拟插件正确地将List项目1向下移动到项目3和4之间,但是当触发mouseup事件时,项目只是快速回到它的原始位置而不是重新排序列表.我怀疑JQuery UI库正在寻找另一个事件,但不幸的是我无法找到它.

请访问http://jsbin.com/efuyef/7/edit#javascript,live查看可排序列表拖动失败的示例.只需刷新页面即可再次运行模拟.

有没有人有任何想法如何我可以正确模拟可排序列表上的拖动事件?非常感谢您的帮助.

unit-testing jquery-ui jquery-ui-sortable

12
推荐指数
1
解决办法
4118
查看次数

在Ruby中将参数命名为局部变量

在使用方法的命名参数时,我发现自己经常在Ruby中编写我认为不必要的代码.

以下面的代码为例:

def my_method(args)
  orange = args[:orange]
  lemon = args[:lemon]
  grapefruit = args[:grapefruit]

  # code that uses 
  # orange, lemon & grapefruit in this format which is way prettier & concise than 
  # args[:orange] args[:lemon] args[:grapefruit]

  puts "my_method variables: #{orange}, #{lemon}, #{grapefruit}" 
end
my_method :orange => "Orange", :grapefruit => "Grapefruit"
Run Code Online (Sandbox Code Playgroud)

我真的不喜欢这段代码的是我必须接受args并将值传递给局部变量,这些变量与DRY原则相反,并且通常占用我的方法中的空间.如果我不使用局部变量并且只使用args [:symbol]语法引用所有变量,那么代码就会变得有些难以理解.

我已经尝试过解决这个问题,但是我不知道如何在方法范围内使用eval或使用任何其他技术来定义局部变量.以下是下面的许多尝试之一,这会导致错误

def my_method_with_eval(args)
  method_binding = binding
  %w{ orange lemon grapefruit}.each { |variable| eval "#{variable} = args[:#{variable}]", method_binding; }

  # code that uses 
  # orange, lemon & grapefruit in …
Run Code Online (Sandbox Code Playgroud)

ruby variables arguments

10
推荐指数
2
解决办法
1657
查看次数

设计:可记住意味着last_sign_in_at不会被可跟踪更新

我正在使用Devise,并依赖于用户模型的last_sign_in_at来计算我的客户是否在X天内没有返回.但是,我最近发现last_sign_in_at仅在实际的表单登录事件发生时更新,而不是由于包含可记住的用户而自动登录时.

如果想要确保每次用户登录时更新last_sign_in_at(新的浏览器会话),无论他们是使用表单登录还是由可记忆的cookie自动登录,我将如何在设计兼容的方式?

authentication ruby-on-rails devise warden

10
推荐指数
2
解决办法
4763
查看次数

Internet Explorer:当目标DOM元素在DOM中移动时,悬停状态变为粘滞状态

我正在构建一个应用程序,允许您通过单击它们将列表项从一个列表移动到另一个列表.但是,为了让用户知道clik的预期动作是什么,我在CSS中设置了一个:悬停状态,显示诸如"<< move"之类的指令

然而,我发现的问题是,在Internet Explorer(测试版本7-9)中,当我移动DOM元素时:该元素的悬停状态保持(变得粘滞),即使鼠标移动也是如此.:当用户将鼠标悬停在其新位置的项目上然后将鼠标移开时,悬停状态才会消失.这似乎是Internet Explorer唯一的问题.

如果您使用IE浏览器,请访问http://jsfiddle.net/hc2Eu/32/

当然有一种解决方法是不使用CSS:悬停状态并使用JQuery悬停事件代替,但这肯定不是最好的做事方式,并保持元素:在CSS中控制的悬停状态是远远的最强有力的做法.解决方法可以在http://jsfiddle.net/hc2Eu/29/上看到

有没有人想出我怎么能告诉Internet Explorer某个元素不再在鼠标下面,它应该释放:悬停状态?

马特

css jquery internet-explorer hover

7
推荐指数
1
解决办法
1582
查看次数

Ruby popen3和ANSI颜色

我试图让watchr在文件发生变化时自动运行测试,并获得我需要的大部分工作,除了RSpec的所有ANSI颜色都被忽略了.违规代码如下:

stdin, stdout, stderr = Open3.popen3(cmd)
stdout.each_line do |line|
  last_output = line
  puts line
end
Run Code Online (Sandbox Code Playgroud)

当cmd等于类似的东西时rspec spec/**/*.rb,上面的代码运行RSpec很好,除了所有输出都是单色的.我已经看过使用了Kernel.system,但系统没有返回输出,我需要确定测试是否失败/成功.如何从Ruby中执行包含ANSI颜色的脚本获取输出,并将其输出到控制台?

ruby colors ansi-escape

6
推荐指数
2
解决办法
869
查看次数

在多个列上使用acts_as_list

我有一个可能独特的情况,我需要一个模型,根据它加入的模型有两个不同的顺序.示例如下:

class Book
  acts_as_list :column => :genre, :scope => :genre
  acts_as_list :column => :author, :scope => :author
  belongs_to :genre
  belongs_to :author
end
Run Code Online (Sandbox Code Playgroud)

所以基本上我要做的是有一个Book模型,它是两个列表的一部分,一个用于它出现的类型页面,另一个用于它出现的作者页面.

acts_as_list似乎不支持使用2 move_to_top位列作为方法,例如不允许您指定要移动到顶部的列表.

有没有人对我如何实现这一点有任何建议?现在我想我将不得不创建一个连接表,例如books_genres有一个position列,但我真的不太热衷于此,因为这需要一大堆额外的表.

ruby-on-rails acts-as-list

6
推荐指数
1
解决办法
2148
查看次数

Ruby 1.9.3-p0和RSpec导致频繁的分段错误

是仅仅是我,还是Ruby 1.9.3在运行RSpec时引入了频繁的分段错误?

从升级到1.9.3开始,我发现启动时间明显加快,但是在50%的时间内运行RSpec时出现分段错误.

我从Ruby获得的输出是http://pastebin.com/89YmpzaJ ,我的Gemfile是http://pastebin.com/L6r73Max

有谁知道是什么原因引起的?我在CI服务器和本地开发机器上都看到了这个问题.

segmentation-fault rspec2 ruby-1.9.3

6
推荐指数
1
解决办法
4844
查看次数

Rails资产管道和javascript文件 - 维护换行符以帮助调试

我最近从Jammit迁移到Rails Asset Pipeline.除了几个出牙问题,一切都运作良好.

但是,我最近开始在生产中遇到一些脚本错误,并意识到我几乎不可能调试它们.我之前已将Jammit配置为保留换行符,但否则会删除javascript文件中的所有空格.这是为了确保如果我看到运行时错误,我将能够找到有问题的行,并希望找出问题所在.使用Rails Asset Pipeline和默认的:uglifier压缩器,它会显示删除所有空格,包括换行符,因此我的脚本错误不会告诉我问题在代码中的位置.

有没有人知道配置Rails Asset Pipeline以保留换行符以便可以调试代码?

马特

ruby-on-rails uglifyjs asset-pipeline

4
推荐指数
1
解决办法
3992
查看次数