我正在评估Pusher和PubNub,以便在我的主要Web客户端和我的服务器之间实现双向实时通信.两者看起来都令人印象深刻,Pusher的文档看起来更好,而PubNub的可扩展性和可靠性显然是他们的强项.
但是,由于我正在管理预算,我担心Pusher和PubNub的成本可能会成为我们的问题,因此我正在考虑使用其中一个开源替代品 - 我主要关注的是Socket.io,Faye和jWebSocket.
尽管我自己运行服务,但我有自己的顾虑:
感谢您的建议.
我最近在我的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,内存问题得到了解决,并且仍然处于极限之下.

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

我使用Backbone.js开发了一个很好的丰富的应用程序界面,用户可以非常快速地添加对象,然后通过简单地选项到相关字段来开始更新这些对象的属性.我遇到的问题是,有时用户将服务器击败到其初始保存,我们最终保存了两个对象.
如何重新创建此问题的示例如下:
用户单击添加人员按钮,我们将其添加到DOM但不保存任何内容,因为我们还没有任何数据.
person = new Person();
用户在"名称"字段中输入一个值,并从中输出选项卡(名称字段失去焦点).这会触发保存,以便我们更新服务器上的模型.由于模型是新的,Backbone.js将自动向服务器发出POST(创建)请求.
person.set ({ name: 'John' });
person.save(); // create new model
然后,用户可以非常快速地键入他们已选中的年龄字段,输入20并将标签输入到下一个字段(因此年龄失去焦点).这再次触发保存,以便我们更新服务器上的模型.
person.set ({ age: 20 });
person.save(); // update the model
因此,在这种情况下,我们期望一个POST请求创建模型,一个PUT请求更新模型.
但是,如果第一个请求仍在处理中,并且我们在上面第3点的代码运行之前没有响应,那么我们实际获得的是两个POST请求,因此创建了两个对象而不是一个.
所以我的问题是,是否有一些最佳实践方法来处理这个问题和Backbone.js?或者,Backbone.js是否应该有一个用于保存操作的排队系统,以便在该对象的上一个请求成功/失败之前不会发送一个请求?或者,或者我应该通过仅发送一个创建请求而不是多个更新请求来构建一些优雅地处理它的东西,可能使用某种类型的限制,或者检查Backbone模型是否在请求的中间并等待该请求是完成.
您对如何处理此问题的建议将不胜感激.
我很高兴能够实现某种排队系统,尽管你可能需要忍受我的代码,这些代码不会像现有的代码库一样好!
我最近建立了一个基于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提供所有流量,而其成本如此之高.那里必须有更好的解决方案.
任何建议或想法将不胜感激.
谢谢马特
我正在尝试编写一些前端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查看可排序列表拖动失败的示例.只需刷新页面即可再次运行模拟.
有没有人有任何想法如何我可以正确模拟可排序列表上的拖动事件?非常感谢您的帮助.
在使用方法的命名参数时,我发现自己经常在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) 我正在使用Devise,并依赖于用户模型的last_sign_in_at来计算我的客户是否在X天内没有返回.但是,我最近发现last_sign_in_at仅在实际的表单登录事件发生时更新,而不是由于包含可记住的用户而自动登录时.
如果想要确保每次用户登录时更新last_sign_in_at(新的浏览器会话),无论他们是使用表单登录还是由可记忆的cookie自动登录,我将如何在设计兼容的方式?
我正在构建一个应用程序,允许您通过单击它们将列表项从一个列表移动到另一个列表.但是,为了让用户知道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某个元素不再在鼠标下面,它应该释放:悬停状态?
马特
我试图让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颜色的脚本获取输出,并将其输出到控制台?
我有一个可能独特的情况,我需要一个模型,根据它加入的模型有两个不同的顺序.示例如下:
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 1.9.3在运行RSpec时引入了频繁的分段错误?
从升级到1.9.3开始,我发现启动时间明显加快,但是在50%的时间内运行RSpec时出现分段错误.
我从Ruby获得的输出是http://pastebin.com/89YmpzaJ ,我的Gemfile是http://pastebin.com/L6r73Max
有谁知道是什么原因引起的?我在CI服务器和本地开发机器上都看到了这个问题.
我最近从Jammit迁移到Rails Asset Pipeline.除了几个出牙问题,一切都运作良好.
但是,我最近开始在生产中遇到一些脚本错误,并意识到我几乎不可能调试它们.我之前已将Jammit配置为保留换行符,但否则会删除javascript文件中的所有空格.这是为了确保如果我看到运行时错误,我将能够找到有问题的行,并希望找出问题所在.使用Rails Asset Pipeline和默认的:uglifier压缩器,它会显示删除所有空格,包括换行符,因此我的脚本错误不会告诉我问题在代码中的位置.
有没有人知道配置Rails Asset Pipeline以保留换行符以便可以调试代码?
马特
ruby ×3
acts-as-list ×1
ajax ×1
ansi-escape ×1
arguments ×1
backbone.js ×1
colors ×1
css ×1
devise ×1
haproxy ×1
heroku ×1
hover ×1
javascript ×1
jquery ×1
jquery-ui ×1
memory ×1
node.js ×1
openssl ×1
pubnub ×1
rspec2 ×1
ruby-1.9.3 ×1
ruby-2.1 ×1
signals ×1
socket.io ×1
ssl ×1
stunnel ×1
uglifyjs ×1
unit-testing ×1
variables ×1
warden ×1
websocket ×1