只是想让人们对使用Unicorn vs Thin作为rails服务器的意见.我在网上发现的大多数文章/基准看起来都很不完整,所以有一个集中的地方讨论它会很好.
Unicron是一个多进程服务器,而thin是基于事件/非阻塞的服务器.基于事件的服务器非常棒......如果您的代码是异步/非阻塞的,那么vanilla rails就会阻塞.因此,除非您使用非阻塞的rails库,否则我真的看不到使用Thin的优势.更糟糕的是,在非阻塞服务器中,如果您的I/O循环阻塞,您将阻止整个循环,并且在阻塞调用返回之前无法处理任何更多请求.阻止库会减慢速度!
为什么Heroku选择Thin作为他们的默认服务器(雪松)?他们是聪明人,所以我相信他们有理由.
贝娄是一个链接,建议用4名Unicorn工人取代Thin - 这对我来说非常有意义. Heroku上的4名Unicron工作人员
mvnrepository通常列出每个依赖项的"版本"和"更新".
固态硬盘现在司空见惯; Amazon EBS由SSD支持,因此大多数云数据库现在也运行在SSD(Heroku PostgreSQL等)上.传统上,数据库和相关体系结构的设计理念是随机访问不好 - SSD不再是这种情况.
SSD如何影响以下?
这个问题基于2篇文章:
- 来自37signals的DHH的Basecamp Next
- Adam Hawkins 在Rails中的高级缓存
我对使用俄罗斯娃娃缓存的性能影响有点困惑,具体来说:
使用自动过期密钥时,似乎每个请求都会导致访问数据库以获取对象时间戳 - 我错过了什么吗?(我知道在最好的情况下,你必须只为层次结构中的顶级键做到这一点,但仍然......)
在第1篇文章中,他们缓存了一个待办事项列表,以及每个待办事项.缓存列表非常有意义,因为它节省了大量工作(所有项目的数据库查询).但为什么要缓存单个项目?您已经访问数据库以获取Item时间戳,那么您究竟要保存什么?生成一些html行?
在第二篇文章中,Adam缓存了这样的视图块:
cache [post, 'main-content']...
cache [post, 'comments']
当添加注释时,它会更改帖子的时间戳,因此会使两个entires无效.但是,main-content没有改变 - 你不想再生它!如何才能使评论无效.(这实际上是一个非常常见的用户案例 - 一个具有一些逻辑上独立的部分的模型:对象本身,不同的关联,某些其他商店中的数据等)
对我来说,只有当你有一个深层次的嵌套对象时,俄罗斯玩偶缓存才有意义.(在basecamp中你有project-> todos list - > todo - > items list).但是,如果您的层次结构较浅,则最好自己进行无效.
对于任何反馈,我们都表示感谢!
谢谢.
在我的应用程序中,我有一个提供商,有一个时间表和客户从预定时间预约.我需要以下功能.
提供商: - 能够指定重复出现的可用性.例如Mon 9-5,Tues 10-3等. - 能够使数据变黑.例如 - 本周一不可用. - 能够添加单个,而不是重复发生的日期/时间段.例如 - 这个星期六9-5.
客户: - 能够预订单一预约. - 能够预订重复预约.(每周一9-4).
到目前为止,我想出了3个选项:
从卡夫卡到卡桑德拉写日期的最佳方式是什么?我希望它是一个解决的问题,但似乎没有一个标准的适配器.很多人似乎都在使用Storm从Kafka读取然后写信给Cassandra,但风暴对于简单的ETL操作来说似乎有些过分.
case类Person(firstName:String,lastName:String)
VS
type Person =(String,String)// firstName,lastName
案例类显然更具可读性.但是,我看到人们使用后者.什么时候使用元组代替它?
作为后续行动
有性能差异吗?在一些使用Tuple2的语言中,就像使用两个原语一样,而创建一个类则会产生开销.但是Scala看起来像Tuple被实现为类.如果我想要压缩两个sequances的情况怎么样,但更喜欢输出是一个案例类,因为下面提到的所有原因.
例如
`case class UserScores(userId: Long, score: Double)`
users.zip(scores).map{(id ,score) => UserScores(id,score)}
Run Code Online (Sandbox Code Playgroud)
上面的示例需要对集合进行额外的迭代,以及额外的对象创建.可以使用视图代替
users.zip(scores).view.map{(id ,score) => UserScores(id,score)}.force
Run Code Online (Sandbox Code Playgroud)
但我不太确定它会产生预期的效果
我知道在将对象转换为数据库之前调用before_create,之后调用after_create.
只有当对象无法满足数据库常量(唯一键等)时,才会调用before_create和after_create.其他我可以将before_create中的所有逻辑放在before_create中
我错过了什么吗?
例如:
castType match {
case _: ByteType => datum.toByte
case _: ShortType => datum.toShort
case _: IntegerType => datum.toInt
case _ => throw new RuntimeException(s"Unsupported type: ${castType.typeName}")
}
Run Code Online (Sandbox Code Playgroud)
到底是什么:做什么?' '是一个占位符,通常意味着"匹配任何东西",但":"是做什么的?如何处理"ByteType"类型?
无法找到一个明确的答案:
WebSockets:支持WebSockets(http://www.pubnub.com/websockets/)和socket.io,但其他SDK是否使用Web套接字?
XMPP:PubNub是否将其用作通信协议?
scala ×2
37-signals ×1
apache-kafka ×1
appointment ×1
calendar ×1
cassandra ×1
database ×1
heroku ×1
maven ×1
neo4j ×1
postgresql ×1
pubnub ×1
redis ×1
schema ×1
thin ×1
unicorn ×1
websocket ×1
xmpp ×1