从开发的角度来看,我一直在阅读伟大的codeigniter.我确信使用该框架将使开发过程更快.但我问自己的问题是,单独制作的框架会不会满足您的需求?
CI虽然广告占用空间很小,却会"陷入困境",因为它基本上是一个框架框架(后面指的是PHP作为C的框架)?有没有很好的方法来分散负载?在CI中,是否存在任何大型应用程序?
谢谢卡斯帕尔.
我从Stack Overflow和其他大型网站的高可伸缩性中读到了这篇文章.许多大型高流量.NET站点如lotsoffish.com,MySpace和Stack Overflow都使用.NET技术并将SQL Server用于其数据库.在文章中它说Stack Overflow中的一个消息来源说:
随着您添加越来越多的数据库服务器,SQL Server许可证成本可能会非常高昂.因此,通过扩大规模并逐步扩展非开源软件,您可能会陷入财务困境.
为什么这些网站不使用MySQL而不是SQL Server?
我打算构建一个可以获得大量流量的应用程序.(请不要说我不会获得流量,这是针对内部网络的,所以流量会在那里.只是试图避免'你不会得到那么多的流量,不要担心它.)
至于我期望的流量类型,用户将浏览各种动态创建的(基于用户帐户详细信息).在这些网站上,用户可以提交文本输入.加载页面和处理用户输入都将命中数据库.加载显然是读取,但处理输入将需要读取和写入.输入也可能影响其他用户的视图.如果发生这种情况,我将需要通知其他用户刷新页面.
我需要做什么样的事情才能在大量用户的负载下崩溃?
什么成为限制因素?数据库东西?前端的I/O?
我以前从来没有真正开发过一个严肃的网络应用程序,我正在寻求一些帮助.
编辑:我正在考虑使用Erlang作为后端,因为我已经使用了一点点,并且非常喜欢所有并发的东西.这是一个可行的选择还是我应该尝试更传统的东西?
Seaside被称为"异端网络框架".使其成为异端的一点是它有很多共享状态.然而,根据我目前的理解,这会妨碍简单的扩展.
另一方面,Ruby on rails共享尽可能少的状态.众所周知,与现代的smalltalk vms相比,它的扩展性非常好.flickr使用php并扩展到极其庞大的基础架构......
那么有没有人在海边扩展方面有一些经验?
在过去,我只在我的本地机器上玩Node.js,所以我只有单进程Node.js应用程序的经验.现在我想创建一个我可以在网上发布的Web应用程序.
这个Web应用程序会像一个多人游戏-使用Socket.IO客户端-服务器通信,快速处理HTTP请求,咕噜任务管理,等等-我想用其他NPM包,以及用于各种任务.
我想设计这个应用程序的架构
如何使用Node实现此目的?
我想高级架构将包括:
由于我的应用程序是一个多人应用程序,每个用户都可以与其他在线用户交互,我应该存储一些可以在这些进程之间共享的公共状态("共享数据").
为了简单起见,首先我不必保留这个共享数据,所以我想我应该使用像Redis这样的内存数据存储.
大局看起来像这样:

这个设计提出了一些问题:
我应该使用Node child_process或cluster模块并手动启动工作进程吗?顺便说一句,是否可以手动启动它们,例如,如果我将我的应用程序部署到Heroku或Nodejitsu?
要么: is there a better way to store these information in a config file?
我的意思是,如果我可以通过编辑代码而不是配置条目来配置我想要的服务器实例数量会更好.
如果我手动生成进程,那么(我猜)所有进程都将在同一个(虚拟)服务器上运行.
如果这个服务器有4个CPU内核,那么你最多可以产生4个Node实例,因为如果你产生更多,你的CPU将进行上下文切换,这会破坏整体性能.
如果我需要更多流程实例,我该怎么办?假设我需要100个服务器实例.我是否必须将我的应用程序部署到25台服务器并在每台服务器上生成4个进程?
在我看来,像Nodejitsu这样的托管服务会以某种方式隐藏你的系统边界层,但我不知道它在实践中是如何工作的.
特别是有这个"共享数据"提供程序组件.我想这个提供程序(如Redis服务器)必须在不同的服务器上运行,因此它可供所有进程使用.但在这种情况下,它很容易成为瓶颈,不是吗?
如果我使用某些托管服务,我是否必须自己设置负载均衡器层?
编辑:
回答几个实际问题:在第一步,我想要无缝地处理4-500个并发用户(Socket.IO连接).这是我可以实际实现的一定数量的访问者.
但我很好奇,设计一个可以轻松扩展的应用程序架构是可能的(如果是的话,如何?).假设我的网站将从一天到下一天变得流行,而不是与几百个并发用户打交道,第二天我必须服务几千人.
据我所知,像Heroku和Nodejitsu这样的云托管服务可以很容易地适应这些场景 - 你只需要增加worker/dynos /的数量 - 但它只有在你拥有合适的应用程序架构时才有效.
关于共享数据:我不想坚持下去.我只想把它留在内存中.由于Socket.IO,一方面需要一些共享数据提供者 - 一个用户能够向另一个"节点"中的用户发送消息.为此,我将使用Redis作为共享数据提供程序.Redis需要处理的事务数量等于Socket.IO发送/接收的消息量,~1000-1500消息/秒.
另一方面,需要一些共享数据提供者,因为我想根据几个标准连接用户.之后,后台进程会定期重新计算/细化这些连接的概率("权重").我已经知道如何实现高效的数据结构来处理对这个内存表的快速插入/删除.因此,"共享数据提供程序"组件将包含一些可以存储这些连接的服务器端代码(可能是Node.js).
我知道它是TL; DR但是我希望它能回答你关于这个问题的所有技术问题.:)
集群/分发Java服务器应用程序的最佳方法是什么?我正在寻找一种方法,允许您通过添加更多应用程序服务器和更多数据库服务器来水平扩展.
"最佳"解决方案允许您为单个节点编写Java应用程序,并希望"隐藏"访问/锁定共享数据的大部分细节.
在分布式环境中,最困难的问题总是归结为多个事务访问共享数据.似乎有两种常见的并发事务方法.
我一直在研究扩展解决方案(以及提供如何扩展的示例的一般应用程序),例如:
Terracotta似乎是最完整的解决方案,因为您可以"轻松"修改现有服务器应用程序以支持扩展(在定义@Root对象和@AutoLockRead/Write方法之后).问题是要真正从分布式应用程序中获得最大的性能,分布式系统的优化实际上并不是一个想法,你必须设计它,知道对象访问可能被网络I/O阻止.
为了正确扩展,似乎总是归结为分区数据和负载平衡事务,例如给定的"执行单元"(cpu core - > thread - >分布式应用程序节点 - > DB主节点)
似乎通过群集使任何应用程序可以正确扩展,您需要能够根据数据访问读/写对事务进行分区.人们提出了哪些解决方案来分发他们的应用程序数据(Oracle,Google BigTable,MySQL,数据仓库),以及一般如何管理分区数据(许多写入主数据库,以及更多读取数据库等).
在扩展数据持久层方面,在将数据划分给许多读者/多个编写者方面,哪种类型的配置最佳扩展(通常我会基于给定用户(或通常是您的任何核心实体)对数据进行分区"root"对象实体)由单个主DB拥有
java concurrency scalability transactions optimistic-locking
使用Heroku,当需要时,一个AUTO如何在web dynos方面扩大规模?假设我们每2-3分钟就会吸引100名并发用户.如果我们的应用程序卡在5-6网络dynos上.我们搞砸了.
其次,我无法在24小时内监控流量,以确定是否需要向上或向下扩展.
到目前为止,我已经看过http://hirefireapp.com/和http://www.heroscale.com/ 有关这两个的任何建议吗?
node.js可伸缩,是什么意思?node.js服务器的哪个部分是可伸缩的.我读到它是一种单线程技术,不适合需要大量CPU资源的应用程序.这些事实不符合可伸缩性,那是什么意思呢?
我正在使用redis for pub/sub以及服务器端缓存.我的意思是我的应用服务器将redis服务器作为一个进程运行(也用作缓存).我有几个瘦客户端(运行redis客户端)以pub/sub模式连接到这个app服务器.我想知道redis存储缓存数据的位置?仅在服务器中,或者客户端中也会有副本.如果有近100个redis客户端通过pub/sub通道连接到服务器,那么以这种方式使用Redis也是个好主意.
谢谢
scalability ×10
heroku ×2
node.js ×2
asp.net ×1
caching ×1
codeigniter ×1
concurrency ×1
flockdb ×1
graph ×1
hazelcast ×1
java ×1
javascript ×1
mysql ×1
neo4j ×1
php ×1
redis ×1
scale ×1
seaside ×1
smalltalk ×1
sql ×1
sql-server ×1
transactions ×1