2012-01-31 77 views
0

在编程语言中,特别是Java中,应该考虑哪些因素以确保应用程序具有可伸缩性?我们举一个Web应用程序的例子,它可以同时为1000个用户提供服务,预计用户可能会增长到100,000。另外假设目前只提供了特定的功能,并且将来我们可能需要添加更多功能,如报告等。我们是否需要确保某些类型的瓶颈不会发生,或者是否应该避免某些类型的设计,这可能会限制可伸缩性?应该考虑怎样考虑可伸缩性

+4

这是一个非常广泛的问题,高度依赖于上下文。提供更多关于什么类型的应用程序的详细信息,可能会给你有用的答案。 – kosa 2012-01-31 15:15:04

+0

编辑了问题陈述 – Gaurav 2012-01-31 15:22:44

回答

1

瓶颈是IO(磁盘,数据库......)和网络。编程语言并不是什么大问题。

3
  1. 尽可能避免锁,尤其是全局锁。
  2. 静态通常会导致锁定看起来像个好主意,尽可能避免静态的情况。他们也使测试更加困难。
  3. 您的数据如何存储?你在使用Sql数据库吗?这将如何扩展?你可以使用NoSql数据存储吗?提示会计类型应用程序的答案是否定的,我们需要Sql的transacionality。
  4. 请注意拉型订阅,具体取决于您的加载推送类型订阅可以更好地扩展。例如10个消费者每秒钟检查一次状态变化是没有问题的,10000个消费者每秒检查一次状态变化更具挑战性。如果数据每分钟更改一次发布效率更高,如果更频繁地更改,则每秒1次发布者可以选择批量更改。
  5. 在你的架构图中寻找星形,当星星中心的机器过载时会发生什么?在很多情况下,这将是您的数据存储区,并且大多数Sql数据库的成本很高,难以扩展到只有大量只读副本的读/写主机。如果情况确实如此,并且你知道你将会变得越来越大,那么请尽早考虑分区(在多个读/写主分区上分割数据)。
  6. 缓存 - 是一个像Memcached一样的共享缓存可以帮助您吗? (通常不需要粘性会话)
  7. 尽早聘请专家来审查设计。
1

决定可扩展性对您意味着什么。

每个应用程序都在某种意义上进行扩展,但“可扩展性”似乎只适用于缺乏在特定问题域中进行扩展的应用程序。您的问题域与我的问题域不同,因此如果我提供可伸缩性建议,则与在应用程序中实际未观察到的用例优化相同。你现在认识到这是过早的优化(很多非常糟糕的系统设计选择的根源)。

因此,要弄清楚什么可能增长,什么可能不增长,并把你的钱(和时间)放在你痛苦的地方。基准。衡量它。

一旦您了解您的应用程序可能无法扩展的感觉,请在尝试解决该问题时进行一点研究。这样你就不是完全靠自己,你可以利用大量的可扩展性工作,但为你的特定情况。

请记住,要实现更好的可伸缩性,您必须在某个地方进行折衷。无论你的程序会在时间,内存,硬件要求或其他方面增长。如果您没有关于处理时间,内存利用率等的性能指标,则您未满足先决条件要求而担心可伸缩性。

0

我想这是浪费时间和空间写在这里。我强烈建议您阅读Scalability Rules,其价格便宜,写得很好,写得很好。