有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java体系结构的性能和可伸缩性问题

我有一个完全用C#编写的高性能系统(我认为,但还没有100%),我认为我在设计时犯了一些重大的架构错误。原因是它不容易扩展

虽然它目前运行得很好,但我想确保它在水平方向上可扩展,以适应我预计几个月后可能出现的卷数增长

该系统有大量并发连接的数据进入系统,这些数据经过处理后最终进入数据库。我们目前每分钟获得大约300条记录/连接

系统的架构是这样的

  1. 整个系统托管在亚马逊的Win2003服务器8GB RAM/4VCPU infra上
  2. C#socket服务器,获取数据并将其放入MSMQ
  3. 用于数据和插入sql server 2008数据库表的处理器。即使在清除定期数据后,其中一个主表仍有大约3 GB的数据。它具有正确的索引,并且当前的报告速度相当快,即使是到远程位置
  4. 然后将处理后的数据发布到MQ,然后对MQ进行处理,以生成特定警报的规则
  5. 除上述程序外,还有其他一些相关程序

现在主要担心的是步骤(3)中处理器的可伸缩性和SQLServer2008的可伸缩性。由于并发连接的大小随着sql server数据的增加而增加,这将使我的生活更加艰难

我想出了两个选择。考虑到当前系统完全基于Microsoft技术,其中之一是对后端处理器的重大更换

对于所有选项,对于最大的主表,请使用postgresql/pgpool III负载平衡(流复制)存储解决方案。其他表格及;模式仍将保留在SQL2008中。这为我提供了一个经济高效的数据库存储解决方案

备选案文1: -用JBOSS&;替换MSMQ;大黄蜂 -将步骤3中的数据处理器放在JBossEJB容器中的容器管理的“消息驱动bean”中,这将为我提供负载平衡和集群的选项
-此选项需要我将解决方案的主要部分转移到unix/linux(我正在考虑fedora)

备选案文2: -将MSMQ替换为ActiveMQ队列(群集和负载平衡) -编写一个Java应用程序,它将处理队列消息并处理数据库持久性
此选项将允许我使用activemq集群实例和java应用程序的新实例增加linux服务器的数量

备选案文3: -将MSMQ替换为ActiveMQ队列(群集和负载平衡) -仅使用当前的数据处理器(进行一些小的更改以将数据推送到postgresql) 此选项将强制我继续使用Windows

请注意,该系统是一个实时系统。如果系统具有99%的故障防护能力就足够了。这不是一个交易系统,所以我可以承受少量的数据丢失

不知道我是否已经清楚地解释了我想要什么。但我欢迎任何问题,因为它们肯定会帮助我更好地解释它

请给出您宝贵的建议,以便为长期解决方案做出正确的选择。事实上,我自己也反对选项3,但我不想再次犯错误,把它从列表中删除

穆图

补充澄清:

抱歉说得不清楚。 1.问题实际上是关于架构的可伸缩性。尤其是横向可伸缩性。 2.当前的平均负载约为每分钟300,这可能不会在一分钟内完全分散。 3.在接下来的8-12个月内,负荷可能更容易扩大到10倍

问题是我们在一个月内销售了大约50台设备,而现在销售团队的增长速度太快了。我相信这个数字很快会翻倍

Sql server有大约8GB的数据,我们限制了amou每个设备的存储容量为nt,这有助于减小大小。目前最大的表被划分为每200个设备1个分区,查询是合理的。但我可以看到Sql方面的可伸缩性瓶颈

因此,即使将Sql server放在另一台服务器上,我可以在Sql server上同时执行的更新数量也会受到限制。我看不到Sql server负载平衡的水平可伸缩性选项(尽管它支持集群的高可用性选项)。我是否误解了负载平衡中的MS Sql


共 (2) 个答案

  1. # 1 楼答案

    每个连接每秒5次更新并不取决于连接的数量。你没有说你有多少人脉,期望有多少人脉

    在Java中,我将在您的情况下(我认为在任何技术中都一样容易)使用批量数据

    消息和数据库的性能问题通常与您执行的消息/事务的速率有关。我将有一个任务/线程,它接收所有挂起的消息,并将这些消息滚动到一个批处理中,一个MQ消息,一个事务到数据库。此解决方案的优点在于,MQ消息传递越慢,批处理越大,处理每个连接消息的效率也越高。剩下的问题只是,消息传递/数据库能否处理数据带宽

  2. # 2 楼答案

    性能和可伸缩性是完全不同的,您不应该混淆它们。所以我的第一个问题是:“你的问题到底是关于什么的?”

    稍微简化了一点,但是:提高性能意味着您可以在更短的时间内执行给定的任务。可伸缩性度量添加资源时系统提高吞吐量的能力

    可伸缩性与体系结构有关,所以我有点困惑,为什么您如此强调工具而不是体系结构本身。MSMQ在许多方面都具有很好的可伸缩性,SQL Server的可伸缩性不太好(与大多数关系数据库一样),但在可伸缩性场景中却非常好

    你说你主要关心的是数据处理器。由于我假设传入的连接彼此独立,一个标准的解决方案是采用物理两层结构,并仅为SQL Server设置一台不同的机器(无论如何,SQL Server都喜欢这种方式)。然后,当网络处理器/数据处理器消耗CPU周期时,SQL Server可以担心(磁盘)I/O并利用其机器的全部RAM,而CPU周期很容易放大(或缩小,通过负载平衡器处理的不同机器上的多个副本)

    Stackoverflow不适合这种讨论,因此我们需要将评论保持在最低限度,并修改问题和答案