代码之家  ›  专栏  ›  技术社区  ›  CaptainHastings

请批评我的服务器设计

  •  0
  • CaptainHastings  · 技术社区  · 16 年前

    我在用Java设计一个服务器,用来交易债券。此服务器将充当客户端UI和分析服务器之间的中介。分析服务器就是大脑,我的服务器只需与之交互(使用TCP套接字),并将响应转发给客户机。

    服务器应同时处理大约500个客户端。它必须具有可扩展性和高效性,以每秒处理大约500条消息。

    客户机UI和分析服务器之间的消息流如下:

    1. Client through the UI requests for price.
    2. My server accepts the message, formats it and then asynchronously
       sends to the analytical server.
    3. When the response from the analytical server arrives, format and send
       the response to the client UI.
    4. If the client likes the price, he/she will request to trade.
    5. Repeat steps 2 & 3.
    

    我利用现有的框架来处理身份验证和发送 服务器和客户机UI之间的消息。我已经对服务器和分析服务器之间的消息位进行了编码。

    在设计服务器的其余部分时,我考虑使用4个阻塞队列。当请求价格时,我立即将请求插入队列(队列1)。然后我有了一个处理器,它从队列1中取出消息,对其进行格式化,并将其放入另一个队列(队列2)。处理器类内部包含一个线程池(executors.FixedThreadPool),每个消息的格式都在一个单独的线程中出现。

    然后我有一个包含另一个线程池的调度程序类。此调度程序类负责从队列2接收消息并将其写入分析服务器。

    当我从分析服务器收到消息时,我将它插入另一个队列(队列3)。我有另一个线程池,它将消息出列并格式化,然后将其放入另一个线程池(队列4)。最后,我还有一个线程池,其中有来自队列4的pops消息,并将其发布到客户机。

    我之所以选择4个不同的队列,是因为如果我愿意,我可以编写一个工具来观察这些队列的大小。有关这些队列大小的信息将

    1. Allow me to tune the size of the thread pools. 
    2. Further, if needed, I can publish the messages contained in these queues
       thus allowing me to monitor all the messages that flows through my server.
    

    你们觉得呢?任何想法,提示都是最受欢迎的。

    干杯

    4 回复  |  直到 13 年前
        1
  •  2
  •   ChssPly76    16 年前

    首先,当你说你的服务器必须每秒“处理”500条消息时,你所说的“处理”到底是什么意思?接受?因为如果您的意思是其他什么,我不确定如何与分析服务器异步。

    其次,我认为您有3个队列太多了:-)您需要一个队列来充当服务器和分析服务器之间的异步缓冲区的同步。除此之外,排队没有什么意义(好吧,这取决于你从分析服务器得到回复的准确程度;如果出于某种原因,你在轮询它而不是被通知,那么你 可以 也需要排队)。

        2
  •  1
  •   Noon Silk    16 年前

    所以,如果处理消息的时间超过1秒,听起来您将拥有500个线程?

        3
  •  0
  •   kopos    13 年前

    有哪些不同的方法可以将消息从分析服务器发送回主服务器(然后转发给客户机)?

    • 轮询?
    • 排队?(这意味着主服务器上的线程需要轮询队列并向客户机发送消息?)
    • 还有别的吗?
        4
  •  0
  •   Abe    13 年前

    这种有4个队列的设计在我看来有点设计过度。您应该使用责任链设计模式,而不是这些队列。如果你使用 Netty 使用它的编码器/解码器和处理程序,您将不需要所有这些队列。netty还提供了一个内存感知的线程池执行器,它可以处理另一个线程中的事件,同时保持内存检查。

    你的要求“我可以检查队列的大小”是可疑的。一个简单的日志记录机制应该可以工作,使它复杂化,如果队列大小失控,就向您自己发送一封电子邮件。这通常表示分析服务器关闭等情况,因此无论如何,您的应用程序将处于不良状态。为了持久性,您可以将传入的数据记录/和/或存储在数据库中,并在服务器崩溃时进行重放。