许多linux/unix编程书籍和教程都讲述了"Thundering Herd Problem",它发生在select()调用中阻塞多个线程或分叉以等待侦听套接字的可读性时.当连接进入时,所有线程和分叉都被唤醒,但只有一个"胜利"并成功调用"accept()".与此同时,浪费了大量的cpu时间无缘无故地唤醒所有线程/分叉.
我注意到一个项目在linux内核中为这个问题提供了"修复",但这是一个非常古老的补丁.
我认为有两种变体; 一个是每个fork执行select()然后是accept(),另一个执行accept().
现代的unix/linux内核在这两种情况下仍然有Thundering Herd问题,还是只有"select()then accept()"版本?
如今,越来越多的注意力转向功能性编程的主要原因之一是多线程/处理的兴起以及FP专注于无副作用的无状态计算的优势,使得可扩展性毫不费力.
当然,在面向对象编程中,我们也可以转向无状态范例,其中所有对象永远不会变异状态.这可以是一种约定,或者甚至可能由语言隐式支持.例如,在对象字段和方法之间强制统一访问的语言中,简单地不允许setter方法就可以实现这一点.
那么,我的问题是,由于面向对象可以利用无状态而对于对象强制有状态,OOP是否有效地成为FP的超集?FP的任何其他优点/特性是否使多线程比OOP更实用?
所以我一直在努力弄清楚NoSQL是否真的在自动分片和处理UNSTRUCTURED数据之外带来了那么多的价值.
假设我可以将STRUCTURED数据放在一台机器上,或者为SQL提供有效的"自动分片"功能,那么NoSQL选项有哪些优势呢?我已经确定了以下内容:
基于文档(MongoDB,Couchbase等) - 除了"自动分片"功能之外,我很难理解其中的好处.链接对象与SQL连接非常相似,而嵌入对象显着膨胀文档大小并导致复制的挑战(注释可能同时属于帖子和用户,因此数据将是多余的).此外,ACID和交易的损失是一个很大的缺点.
基于键值(Redis,Memcached等) - 提供不同的用例,非常适合缓存但不是复杂的查询
Columnar(Cassandra,HBase等) - 这里的最大优势似乎是数据如何存储在磁盘上,并且主要用于聚合而不是一般用途
图(Neo4j的,OrientDB等) -最引人注目的地方,同时使用边沿和节点使一个有趣的价值主张,但对于高度复杂的关系数据,而不是一般用途最有用.
我可以看到Key-value,Columnar和Graph DB对于特定用例(缓存,社交网络关系映射,聚合)的优势,但是看不出任何理由使用像MongoDB这样的结构数据之外的'自动 - 分割'能力.
如果SQL具有类似的"自动分片"能力,那么SQL对于结构化数据来说是不是很明智吗?在我看来会是这样,但我希望社区的意见......
注意:这与典型的CRUD应用程序有关,如社交网络,电子商务网站,CMS等.
我一直在浏览这个网站以获得答案,但我仍然不确定如何在其数据库结构和实现中规划类似的系统.
在PHP和MySQL中,很明显会立即获得一些成就(当采取专门行动时,在所有情况下:填写所有个人资料字段),虽然我知道在一定时间后更新并分配徽章.如此多的用户和徽章不会产生性能问题(就规模而言:用户和徽章数量都很大).
所以我假设的数据库结构就像这样简单:
Badges     |    Badges_User      |    User
----------------------------------------------
bd_id      |    bd_id            |  user_id
bd_name    |    user_id          |  etc
bd_desc    |    assigned(bool)   |  
           |    assigned_at      |
但正如有些人所说,最好采用增量式方法,因此拥有1,000,000个论坛帖子的用户不会放慢任何功能.
那么它是徽章的另一个表可能是增量的还是上面badges_user表中的'progress'字段?
感谢阅读,请关注所需系统的可扩展性(如数以千计的用户和20到40个徽章).
编辑:有些人认为我已经指定了一些混淆日期/时间,颁发徽章的标准最好放在准备好的查询/每个徽章的功能中不会吗?(更好的灵活性)
当您需要执行I/O(即数据库操作)时,actor模型(在Akka中)如何工作?
我的理解是,阻塞操作会引发异常(并且由于Akka使用的Netty的自然性质而基本上破坏了所有并发性).因此我将不得不使用Future或类似的东西 - 但我不理解并发模型.
future(即.future.get())中进行了一个阻塞调用,它只会阻止当前actor的执行; 还是会阻止所有参与者的执行,直到阻止呼叫完成?基本情况是这样的:
有没有更好的方法来实现这一目标?
我在技术博客中阅读了以下文本,讨论了NoSQL的优缺点
" 多年来,为了提高数据库服务器的性能,数据库管理员不得不在数据库负载增加(扩展)时购买更大的服务器,而不是随着负载的增加(扩展)将数据库分布在多个"主机"上.RDBMS通常不会轻易扩展,但较新的NoSQL数据库实际上旨在轻松扩展以利用新节点,并且通常在设计时考虑到低成本的商用硬件."
我对RDBMS和NoSQL的可扩展性感到困惑.
我的困惑是:
我用C++开发了一个迷你HTTP服务器,使用boost :: asio,现在我用多个客户端加载测试它,我一直无法接近饱和CPU.我正在测试一个Amazon EC2实例,大约50%使用一个cpu,20%使用另一个cpu,其余两个闲置(根据htop).
细节:
那么,我应该怎样看待改善这一结果呢?鉴于CPU大部分处于空闲状态,我希望利用这些额外的容量来获得更高的吞吐量,比如800请求/秒等等.
我有过的想法:
我有一个PHP的网站,Lighttpd.它也在Centos 5上使用MySQL.我用Apache Bench(ab)测试了我的PHP代码.它导致一些错误(失败的请求)表明其他长度超过正常.我绝对相信我的PHP结果总是应该具有相同的确切长度.我已经查看了我的Lighttpd和MySQL日志和错误日志,并且没有任何错误.
有没有办法在结果有其他长度时确切地检查ab得到什么,或者是否有其他方法可以找出原因是什么或"坏"结果是什么?
我需要知道,因为我需要100%的好结果.
-bash-3.2# ab -n 500 -c 200 http://domain.com/test/index.php
This is ApacheBench, Version 2.0.40-dev <$Revision: 1.146 $> apache-2.0
Copyright 1996 Adam Twiss, Zeus Technology Ltd, http://www.zeustech.net/
Copyright 2006 The Apache Software Foundation, http://www.apache.org/
Benchmarking domain.com (be patient)
Completed 100 requests
Completed 200 requests
Completed 300 requests
Completed 400 requests
Finished 500 requests
Server Software:        lighttpd/1.4.20
Server Hostname:        domain.com
Server Port:            80
Document Path:          /test/index.php
Document Length:        15673 bytes
Concurrency Level:      200
Time taken for tests:   0.375862 seconds …我们有一个构建在SQL数据库之上的Web应用程序.几种不同类型的对象可以添加注释,其中一些对象需要字段级跟踪,类似于在大多数问题跟踪系统上跟踪字段更改的方式(例如状态,分配,优先级).我们想要显示变更的对象,之前的值是什么,以及新值是什么.
在纯设计级别,跟踪通用表中任何对象的每个更改是最直接的,包括对象类型,对象主键,进行更改的用户的主键,字段名称和列的列.新旧价值观.在我们的例子中,如果用户在进行更改时输入了注释,这些也可以选择具有注释ID.
但是,随着这些数据增长的速度,这是最好的架构吗?通常采用哪些方法将这种类型的功能添加到已经大规模的应用程序中?
[ 编辑 ]我正在开始对这个问题的赏金,主要是因为我想特别找出在处理规模方面最好的架构是什么.Tom H.的答案是提供信息的,但推荐的解决方案似乎是相当大小的效率(对象的每个新状态都是新行,即使许多列没有改变)也不可能,因为我们必须要求能够跟踪用户创建的字段的更改.特别是,我可能会接受一个可以解释常见问题跟踪系统(JIRA或类似)如何实现这一点的答案.
我喜欢NodeJS的一些功能,特别是JQuerification,通过socket.io,视图和css引擎的websocket兼容性,我不能用JSP(当然还有异步调用).至少,据我所知.所以我打算创建我的应用程序,后端将是Java,前端将由NodeJS生成.前端表单将向NodeJS发送数据,NodeJS将通过NodeJS和Java后端之间的套接字连接将数据传递给Java后端.因此NodeJS基本上就像前端和Java后端之间的中间件.
这将是一个非常大的应用程序,我的计划看起来令人兴奋,但我会讨厌我未来的自我走这条路吗?
我的优势在于我可以拥有大量的实时图表和仪表板,并增强与表单的交互.
scalability ×10
architecture ×2
linux ×2
nosql ×2
php ×2
sql ×2
actor ×1
akka ×1
apachebench ×1
boost-asio ×1
c++ ×1
database ×1
java ×1
lighttpd ×1
load-testing ×1
mysql ×1
node.js ×1
oop ×1
rdbms ×1
scala ×1
sharding ×1
stateless ×1
websocket ×1