我有一台用作API服务器的Netty HTTP服务器。用户将事件发送到API服务器,并使用执行程序服务或Akka等并发框架处理同一服务器中其他线程上的事件。我有两种选择;当我将事件发送到另一个线程时,我可以等待响应并将其写入套接字,或者只是将确认消息写回套接字。
当我等待响应时,http请求的延迟会增加,服务器可以处理的请求数会减少。另一方面,无法控制背压,因此我们不知道服务器何时处理事件,我无法通知用户服务器处理了事件。但是,服务器可以处理的http请求数量会增加,因为几乎所有请求的延迟都非常低。
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof HttpRequest) {
executor.submit(new Event(msg));
// do not wait for the response
ctx.write(new DefaultFullHttpResponse(HTTP_1_1, OK));
}
}
public void channelRead(ChannelHandlerContext ctx, Object msg) {
if (msg instanceof HttpRequest) {
Future<Object> future = executor.submit(new Event(msg));
future.after(x -> ctx.write(new DefaultFullHttpResponse(HTTP_1_1, OK)));
}
}
由于它是一个API服务器,我不必等待响应,以便通知用户该事件已被处理,因为它只是一个写入请求而不是#39 ; t返回一个回复。那么哪种方式对于http服务器来说是最方便的呢?您认为第二种选择对其性能有何益处?
答案 0 :(得分:1)
我认为答案取决于您的要求。总的来说,遵循的一个好理念是保持简单。这可能意味着需要进行最少量的工作,这可能意味着为可扩展性留出空间。如果你的用例没有提供状态是有意义的,那么你会这样做的原因是什么?然而,通常在简单和提供对系统的足够可见性之间进行权衡。听起来你不确定是什么和不需要什么?
问自己以下问题:
在这种情况下,这些只是你应该问自己的许多问题中的一小部分。根据您提供的信息,我不确定是否可以为您提供&#34;您应该做X&#34;或者&#34;你应该做Y&#34;回答。我认为通过重新评估您的要求并向自己问一些类似上面列出的问题,您将获得最佳服务。