Questions tagged «scalability»

可伸缩性是系统,网络或进程以有能力的方式处理不断增长的工作量的能力,或者为了适应这种增长而进行扩展的能力。

3
为什么虚拟机上的更多CPU内核会降低编译时间?
[edit#2]如果来自VMWare的任何人都可以使用VMWare Fusion的副本来打我,我很乐意做与VirtualBox与VMWare比较的相同操作。我以某种方式怀疑VMWare虚拟机管理程序将针对超线程进行更好的调整(也请参见我的答案) 我看到一些奇怪的东西。随着我在Windows 7 x64虚拟机上增加内核数量,总体编译时间会增加而不是减少。编译通常非常适合并行处理,因为在中间部分(后依赖映射)中,您可以简单地在每个.c / .cpp / .cs /任何文件上调用一个编译器实例,以建立供链接器使用的部分对象过度。所以我以为编译实际上可以很好地扩展内核数。 但是我看到的是: 8核:1.89秒 4核心:1.33秒 2核心:1.24秒 1核心:1.15秒 这仅仅是由于特定供应商的虚拟机管理程序实现(在我的情况下为type2:virtualbox)导致的设计工件,还是在更多的VM上更普遍地使虚拟机管理程序实现更简单?有这么多因素,我似乎能够为这种行为辩护和反对-因此,如果有人比我更了解这一点,我很想读您的答案。 谢谢席德 [ 编辑:解决评论 ] @MartinBeckett:冷编译被丢弃了。 @MonsterTruck:找不到直接编译的开源项目。太棒了,但现在不能搞定我的开发环境。 @Mr Lister,@philosodad:使用VirtualBox时有8个硬件线程,因此应该以1:1映射而不进行仿真 @Thorbjorn:我有6.5GB的虚拟机和一个较小的VS2012项目-我换入/换出垃圾页面文件的可能性很小。 @All:如果有人可以指向一个开源VS2010 / VS2012项目,那么这可能比我(专有)VS2012项目更好的社区参考。Orchard和DNN似乎需要调整环境才能在VS2012中进行编译。我真的很想看看使用VMWare Fusion的人是否也看到了这一点(针对VMWare与VirtualBox划分) 测试细节: 硬件:Macbook Pro Retina CPU:Core i7 @ 2.3Ghz(四核,超线程= Windows任务管理器中的8核) 记忆体:16 GB 磁盘:256GB SSD 主机操作系统:Mac OS X 10.8 VM类型:VirtualBox 4.1.18(类型2虚拟机管理程序) 来宾操作系统:Windows 7 …

3
如何用Java设计高度可扩展的Web服务?
我正在创建一些具有2000个并发用户的Web服务。该服务是免费提供的,因此有望获得大量用户。将来可能需要扩展到50,000个用户。 已经有一些其他问题可以解决此问题,例如 -/programming/2567254/building-highly-scalable-web-services 但是,我的要求与上述问题有所不同。 例如-我的应用程序没有用户界面,因此图像,CSS,javascript不是问题。它是用Java编写的,因此使用HipHop将PHP转换为本地代码的建议毫无用处。 因此,我决定单独询问我的问题。 这是我的项目设置- 使用Apache CXF的基于Rest的Web服务 Hibernate 3.0(具有相关的优化功能,例如延迟加载和自定义HQL以进行优化) Tomcat 6.0 MySQL 5.5 为了使基于Java的应用程序可扩展,应遵循哪些最佳实践?


7
将高频事件保存到连接限制受限的数据库中
我们有一种情况,我必须处理大量涌入服务器的事件,平均每秒大约1000个事件(峰值可能是2000个)。 问题 我们的系统托管在Heroku上,并使用相对昂贵的Heroku Postgres DB,该数据库最多允许500个DB连接。我们使用连接池从服务器连接到数据库。 事件传入的速度快于数据库连接池无法处理的速度 我们遇到的问题是事件的发生速度快于连接池无法处理的速度。到一个连接完成从服务器到DB的网络往返时,它可以释放回池中,而不是n其他事件。 最终,事件堆积起来,等待保存,并且由于池中没有可用的连接,它们超时并且整个系统变得无法运行。 我们已经通过以较慢的速度从客户端发出有问题的高频事件来解决紧急情况,但是我们仍然想知道在需要处理高频事件时如何处理这种情况。 约束条件 其他客户端可能希望同时读取事件 其他客户端连续请求使用特定密钥读取所有事件,即使它们尚未保存在数据库中也是如此。 客户端可以查询GET api/v1/events?clientId=1并获取客户端1发送的所有事件,即使这些事件尚未保存到DB中也是如此。 是否有有关如何处理此问题的“教室”示例? 可能的解决方案 使事件排队在我们的服务器上 我们可以在服务器上排队事件(队列的最大并发性为400,因此连接池不会用完)。 这是个坏主意,因为: 它将耗尽可用的服务器内存。堆积的排队事件将消耗大量RAM。 我们的服务器每24小时重启一次。这是Heroku施加的硬限制。当事件排队时,服务器可以重新启动,导致我们丢失排队的事件。 它在服务器上引入状态,从而损害了可伸缩性。如果我们有一个多服务器设置,并且客户端要读取所有已排队+保存的事件,则我们将不知道已排队事件在哪台服务器上。 使用单独的消息队列 我假设我们可以使用消息队列(例如RabbitMQ吗?),在其中将消息泵入其中,另一方面,还有另一台服务器仅处理将事件保存在DB上。 我不确定消息队列是否允许查询排队的事件(尚未保存),因此,如果另一个客户端想要读取另一个客户端的消息,我只能从数据库中获取已保存的消息,并从队列中获取待处理的消息。并将它们连接在一起,这样我就可以将它们发送回读取请求客户端。 使用多个数据库,每个数据库使用中央数据库协调器服务器保存一部分消息,以管理它们 不过,我们的另一个解决方案是使用多个数据库,并使用一个中央“ DB协调器/负载平衡器”。接收到事件后,此协调器将选择一个数据库来写入消息。这应该允许我们使用多个Heroku数据库,从而将连接限制提高到500 x数据库数。 在进行读取查询时,此协调器可以SELECT向每个数据库发出查询,合并所有结果,然后将其发送回请求读取的客户端。 这是个坏主意,因为: 这个主意听起来像是...太设计了吗?管理(备份等)也将是一场噩梦。它的构建和维护非常复杂,除非绝对必要,否则听起来像是违反了KISS。 它牺牲了一致性。如果我们遵循这个想法,那么跨多个数据库进行事务是不可行的。

1
数据模型在所谓的“ NoSQL”数据库中对可伸缩性和性能有多大影响?
如果不带CAP定理(一致性,可用性,分区:选择两个),就永远无法谈论所谓的“ NoSQL”数据库。如果您不得不说,在MongoDB(分区,一致性)和CouchDB(可用性,分区)之间,首先需要考虑的是“我需要正确的数据还是需要一直访问?”。 这些新的数据库中取得进行分区。但是,如果我不这样做怎么办?如果我只是想拥有一个键/值,列,文档,任何数据库而不是一个关系数据库,并且只创建一个服务器实例而不进行分片,那该怎么办呢?在那种情况下,我既没有可用性又没有一致性吗?MongoDB不需要复制任何内容,因此可以使用。而且CouchDB将只有一个数据源,因此它将非常一致。 因此,那意味着在那种情况下,MongoDB和CouchDB在用例方面几乎没有区别?好吧,当然除了性能,API和其他功能外,但这更像是在PostgreSQL和MySQL之间进行选择,而不是拥有两个根本不同的要求。 我在这里吗?是否可以通过不创建多个实例将AP或CP数据库更改为AC数据库?还是我缺少什么? 我们反过来问这个问题。如果我使用一个关系数据库,比如说MySQL,并将其置于主/从配置中,该怎么办?我不使用ACID事务如果我要求立即将所有写入同步到从属服务器,那岂不是使其成为CP数据库吗?而且,如果我将其同步了一些预定义的时间间隔,并且客户端是否从从属设备读取过时的数据也没关系。那不是将它变成AP数据库吗?这是否意味着如果我放弃ACID合规性,仍然可以对部分数据库使用关系模型? 本质上:在CAP定理中,您准备放弃的可扩展性要比基础数据模型还重要吗?具有列,文档,键值等内容是否可以增强关系模型的可伸缩性?我们可以设计一个完全为分区容忍度设计的关系数据库吗?(也许它已经存在)。我们可以使NoSQL数据库ACID兼容吗? 抱歉,它有很多问题,但是最近我阅读了很多有关NoSQL数据库的信息,在我看来,使用它们的最大好处是,它们更适合数据的“形状”,而不仅仅是分区CAP并放弃了ACID合规性。毕竟,并不是每个人都有太多数据需要分区。在我甚至考虑对数据进行分区之前,不使用关系模型是否会对性能/可伸缩性有所帮助?

5
为什么Scala比其他语言更具可扩展性?
已锁定。该问题及其答案被锁定,因为该问题是题外话,但具有历史意义。它目前不接受新的答案或互动。 Scala被称为可扩展语言,该功能甚至包括在其名称中: Scala这个名字是“可扩展”和“语言”的缩写,表示它旨在根据用户的需求进行扩展。 在Scala中,“可伸缩”是什么意思?是什么使Scala比Java更具可扩展性?

1
如何避免健谈的界面
背景: 我正在设计一个服务器应用程序,并为不同的子系统创建单独的dll。为简化起见,假设我有两个子系统:1)Users2)Projects 用户的公共界面具有如下方法: IEnumerable<User> GetUser(int id); 而且Projects的公共接口具有如下方法: IEnumerable<User> GetProjectUsers(int projectId); 因此,例如,当我们需要显示某个项目的用户时,我们可以调用GetProjectUsers,这将为对象提供足够的信息以显示在数据网格或类似物中。 问题: 理想情况下,Projects子系统不应同时存储用户信息,而应仅存储参与项目的用户的ID。为了服务的GetProjectUsers,它需要调用GetUser的的Users系统存储在自己的数据库中的每个用户ID。但是,这需要大量单独的GetUser调用,从而在User子系统内部引起大量单独的sql查询。我还没有真正测试过,但是具有这种健谈的设计会影响系统的可伸缩性。 如果不考虑子系统的分离,我可以将所有信息存储在两个系统Projects都可以访问的单个模式中,并且可以简单地执行a操作,JOIN以在单个查询中获取所有项目用户。Projects还需要知道如何User从查询结果中生成对象。但这打破了具有许多优点的分离。 问题: 有人可以建议一种在避免所有这些单独GetUser通话的同时保持分隔的方法GetProjectUsers吗? 例如,我曾想过让用户为外部系统提供使用标签值对“标记”用户并请求具有特定值的用户的能力,例如: void AddUserTag(int userId, string tag, string value); IEnumerable<User> GetUsersByTag(string tag, string value); 然后,Projects系统可以在将每个用户添加到项目中时对其进行标记: AddUserTag(userId,"project id", myProjectId.ToString()); 在GetProjectUsers期间,它可以在一次调用中请求所有项目用户: var projectUsers = usersService.GetUsersByTag("project id", myProjectId.ToString()); 我对此不确定的部分是:是的,用户与项目无关,但实际上有关项目成员资格的信息存储在用户系统中,而不是项目中。我只是感觉不自然,所以我试图确定我是否缺少一个很大的劣势。

7
何时开始考虑可伸缩性?[关闭]
已关闭。这个问题是基于观点的。它当前不接受答案。 想改善这个问题吗?更新问题,以便通过编辑此帖子以事实和引用的形式回答。 6年前关闭。 我遇到了一个有趣但又可怕的问题。我将要启动一个新的(iPhone)应用程序。这是在我自己的自定义后端上运行的基于回合的多人游戏。但是我怕发射。 由于某种原因,我认为它可能会变得很大,并且它的流行将杀死我可怜的孤独的单服务器+ MySQL数据库。 一方面,我在想如果它正在增长,那么我最好做好准备,并拥有可扩展的基础架构。 另一方面,我只是想将其发布到世界上,看看会发生什么。 我经常读诸如“过早的优化是万恶之源”之类的文章,或者有人说您应该立即使用手头的工具来构建杀手级游戏,而后再担心诸如可扩展性之类的问题。 我很想听听专家或有经验的人对此的一些看法。谢谢!


6
什么时候变得过度杀伤力?
首先,我很抱歉,因为我不知道如何创建社区线程。所以有人帮我 作为开发人员,跨越许多平台,技术甚至在基础架构级别;我总是问自己,我什么时候做得太多? 自从我开始以来,这是一个永无止境的学习过程。我了解到的一(1)件事是,要求在很长一段时间内几乎都无效,因此,稍加预见可能会大有帮助。 但是平衡在哪里,又怎么知道何时失去时间却没有获得时间呢?
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.