我正在设计一个用于交易债券的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)。然后,我有一个处理器,它从Queue1中取出消息,对其进行格式化并将其放入另一个队列(Queue2)。处理器类内部包含一个线程池(Executors.fixedThreadpool),每个消息的格式化都发生在一个单独的线程中。
然后我有一个包含另一个线程池的调度程序类。此调度程序类负责从Queue2获取消息并将其写入Analytical服务器。
当我从分析服务器收到消息时,我将其插入另一个队列(Queue3)。我有另一个线程池,它将消息出列并格式化并将其放入另一个(Queue4)。最后,我有另一个线程池,其中包含来自Queue4的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.
那你们觉得怎么样?任何想法,提示都是最受欢迎的。
干杯
答案 0 :(得分:2)
首先,当你说你的服务器每秒必须“处理”~500条消息时,“句柄”到底是什么意思?接受?因为如果你的意思是其他任何东西,我不确定分析服务器的异步是如何异步的。
其次,我认为你有3个队列太多:-)你需要一个队列作为服务器和分析服务器之间的同步到异步缓冲区。除此之外,排队其他任何东西都没有意义(好吧,这取决于你从分析服务器获得响应的确切程度;如果由于某种原因你正在轮询它而不是被通知那么你可能< / em>也需要那里的队列。)
答案 1 :(得分:1)
所以听起来你最终会得到500个线程,如果处理消息的时间超过1秒呢?
答案 2 :(得分:0)
有哪些不同的方法可以将消息从分析服务器发送回主服务器(然后将其转发给客户端)?
答案 3 :(得分:0)
这个有4个队列的设计对我来说有点过分。您应该使用责任链设计模式而不是这些队列。如果您使用Netty及其编码器/解码器和处理程序,那么您将不需要所有这些队列。 Netty还提供了一个内存感知线程池执行程序,它可以在保持内存检查的同时处理另一个线程中的事件。
您的要求“我可以检查队列中的大小”是可疑的。一个简单的日志记录机制应该可以工作,如果队列大小失控,它会使它变得复杂,向自己发送一封电子邮件。这主要表示分析服务器已关闭等情况,因此无论如何您的应用程序将处于不良状态。对于持久性,您可以记录/和/或在db中存储传入数据,并在服务器崩溃时重放。