NIO Reactor 模式:每 N 毫秒在选择器循环内接收异步回调

发布于 2025-01-06 07:46:11 字数 326 浏览 0 评论 0 原文

我想知道 Java NIO 中的标准/最佳实现是什么。这是实现每 N 秒一次心跳等功能的基础。 注意:由于明显的原因(线程是邪恶的并且上下文切换很慢),一切都必须始终发生在选择器循环内。

注1:回答 Apache MINA 不算数,除非您和框架能够演示一个清晰的场景,其中该场景是在 KISS(保持简单愚蠢)方式。

注2:管道需要螺纹。

I was wondering what is the standard/best implementation of that in Java NIO. This is fundamental to implement something like heartbeats every N seconds, etc. Note: For obvious reasons (threads are evil and context switches are slow) everything must always happens inside the selector loop.

Note1: Answering Apache MINA does not count, unless you and the framework can demonstrate a clear scenario where this is done in a KISS (Keep It Simple Stupid) way.

Note2: Pipes require threads.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

路还长,别太狂 2025-01-13 07:46:11

不确定为什么没有后台线程来发送心跳或超时连接。心跳通常不被认为对性能至关重要。

您可以让选择器等待特定的时间并发送心跳并定期检查超时。

你的意思是像

selector.select(timeout);

if (System.currentTimeMS() > sendHeartbeatTime) {
    for(Connection conn: connections) 
        conn.checkAndSendHeartbeat();
}

// in Connection
private long lastSend = System.currentTimeMS();
private long lastRead = System.currentTimeMS();

public void writeData() {
   lastSend = System.currentTimeMS();
   // write data.
}

public void checkAndSendHeartbeat() {
   long now = System.currentTimeMS();
   if (now - lastRead > HEARTBEAT_TIMEOUT) {
      closeConnection();
   else if (now - lastSend > HEATBEAT_INTERVAL)
      writeHeartBeatData();
} 

Not sure why you wouldn't have a background thread for sending heartbeats or timing out connections. Heartbeats are not generally considered performance critical.

You can have the selector wait a specific amount of time and send heartbeats and check time outs at intervals.

Do you mean like

selector.select(timeout);

if (System.currentTimeMS() > sendHeartbeatTime) {
    for(Connection conn: connections) 
        conn.checkAndSendHeartbeat();
}

// in Connection
private long lastSend = System.currentTimeMS();
private long lastRead = System.currentTimeMS();

public void writeData() {
   lastSend = System.currentTimeMS();
   // write data.
}

public void checkAndSendHeartbeat() {
   long now = System.currentTimeMS();
   if (now - lastRead > HEARTBEAT_TIMEOUT) {
      closeConnection();
   else if (now - lastSend > HEATBEAT_INTERVAL)
      writeHeartBeatData();
} 
月棠 2025-01-13 07:46:11

创建一个管道,在选择器中注册可读管道的末端,调度一个计时器,在计时器回调中向可写管道的末端写入一个字节。 IO 处理程序应将管道可读事件视为心跳触发器。

create a pipe, register readable pipe's end in selector, schedule a timer, in the timer callback write one byte into the writable pipe's end. The IO handler should treat pipe readable event as a heartbeat trigger.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文