黄金法则 — 不要阻塞事件循环

我们已经知道 Vert.x Api 是非阻塞,并且不会堵塞事件循环。
如果你堵塞事件循环,那事件循环将不能做别的事,因为它被阻塞了。如果所有的event loop被阻塞了,应用程序将完全停止!

所以不要这样做!你已经被警告

阻塞的例子包括:

  • Thread.sleep()
  • 等待锁
  • 等待互斥体或监视器 (例如同步段)
  • 做一个长时间的数据库操作和等待返回
  • 做复杂的计算,需要很长的时间。
  • 死循环。

如果有上述情况停止了事件循环(event loop),需要相当长的时间,你应经立即去下一步,并等待进一步的指示。

这个时间具体多长?

具体多长时间?它取决于应用程序需要的并发量。

如果你有一个单一的事件循环,并且你想要处理每秒 10000 的 http 请求,然后很明显,每个请求不能超过 0.1 ms 要处理,所以你不能阻塞比这更多的时间。

这道数学题并不是困难,作为练习留给读者。

如果您的应用程序不响应,可能你阻塞的事件循环的地方。为了帮助您诊断此类问题,如果它检测到一段时间后事件循环还没有恢复,Vert.x会自动记录警告。如果你在日志中看到这样的警告,那么你就应该去检查应用。

  1. Thread vertx-eventloop-thread-3 has been blocked for 20458 ms

Vert.x 还将提供堆栈跟踪来确定阻塞发生的位置。

如果你想关闭这些警告或更改设置,你可以在创建Vertx对象之前,使用VertxOptions配置。