Java 请评论我的服务器设计

Java 请评论我的服务器设计,java,Java,我正在用java设计一个用于债券交易的服务器。此服务器将充当客户端UI和分析服务器之间的中介。分析服务器就是大脑,我的服务器只需与之交互(使用tcp套接字)并将响应转发给客户端 服务器预计将同时处理约500个客户端。而且它必须具有可扩展性和高效性,以每秒处理约500条消息 客户端UI和分析服务器之间的消息流如下所示: 1. Client through the UI requests for price. 2. My server accepts the message, formats it

我正在用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个阻塞队列。当价格请求到来时,我立即将请求插入队列(Queue1)。然后我有一个处理器,它将消息从队列1中取出,格式化并放入另一个队列(队列2)。processor类内部包含一个线程池(Executors.fixedThreadpool),每个消息的格式化都发生在一个单独的线程中

然后我有一个包含另一个线程池的dispatcher类。此dispatcher类负责从Queue2获取消息并将其写入分析服务器

当我从分析服务器收到消息时,我将其插入另一个队列(Queue3)。我有另一个线程池,它对消息进行出列和格式化,并将消息放入另一个线程池(队列4)。最后,我有另一个线程池,其中包含从队列4中弹出的消息并发布到客户端

我之所以选择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.
你们怎么想?欢迎提出任何想法和建议


干杯

如果处理消息的时间超过1秒,听起来你会有500个线程?

如果处理消息的时间超过1秒,听起来你会有500个线程?

首先,当你说你的服务器必须每秒“处理”500条消息时,你的意思是什么“handle”?Accept?因为如果您指的是其他内容,我不确定这与分析服务器的异步性有什么关系


其次,我认为您有3个太多的队列:-)您需要一个队列来充当服务器和分析服务器之间异步缓冲区的同步。除此之外,对其他任何东西进行排队都没有什么意义(好吧,这取决于您从分析服务器获得响应的准确程度;如果出于某种原因,您正在轮询它而不是收到通知,那么您可能也需要那里的队列)。

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


其次,我认为您有3个太多的队列:-)您需要一个队列来充当服务器和分析服务器之间异步缓冲区的同步。除此之外,将任何其他内容排队都没有什么意义(这取决于您从分析服务器获得响应的确切方式;如果出于某种原因,您正在轮询它而不是收到通知,那么您可能也需要在那里排队).

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

  • 投票
  • 排队?(这意味着主服务器上的线程需要轮询队列并向客户端发送消息?)
  • 还有别的吗

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

  • 投票
  • 排队?(这意味着主服务器上的线程需要轮询队列并向客户端发送消息?)
  • 还有别的吗

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


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

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


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

不是一个有真实答案的问题。

一个“虚构”的答案很适合我。一个问题必须有一个普遍认同的答案才能成为一个问题吗?不是一个有真正答案的问题