我使用vert.x来读取文件并进行转换,然后推送到kafka。 我正在使用2个Verticle,而不使用任何工作线程(我不想更改文件中日志的顺序)。
Verticle 1 : Read the file and filter
Verticle 2 : Publish to kafka
每个文件包含大约120000行
然而,我观察到有一段时间后我停止从Verticle 1观察日志。 我怀疑事件总线已满,所以消费者仍然在消耗,但生产者线程正在等待事件总线变空。
所以我的问题是 1.事件总线的默认大小是多少?在Docs中它说
DEFAULT_ACCEPT_BACKLOG
The default accept backlog = 1024
2。如何确认我怀疑发布商线程被阻止?
答案 0 :(得分:1)
VertX在内部将Netty的SingleThreadEventLoop
用于其事件总线maximum pending tasks allowed is Integer.MAX_VALUE,这可能是20亿条消息。
您可能需要尝试VertxOptions.setWarningExceptionTime(long warningExceptionTime)
将该值设置为低于默认值(5秒),以查看是否有任何有关阻塞线程的警告。
答案 1 :(得分:0)
我不确定accept-backlog设置是否对eventbus有任何影响,因为它可能与netserver有关,但是从我没有发现任何用途的代码的短扫描中eventbus。
然而事件总线确实会立即传递消息,消息不会在某处排队(至少这是我从代码中理解的)。所以关于你的第一个问题,它没有任何大小,至少在本地运行时没有(不知道集群版本,但我认为这不适用于你的情况)
要确认(事件循环)线程实际被阻止很容易,您的日志中应该有大量异常,说明事件循环被阻止。
我猜你的问题出在其他地方,但如果没有任何代码或有意义的日志,这实际上很难说。
答案 2 :(得分:0)
为了补充@iwat答案,在我使用的版本中,看起来最大大小是从系统属性中读取的:
protected static final int DEFAULT_MAX_PENDING_TASKS = Math.max(16, SystemPropertyUtil.getInt("io.netty.eventLoop.maxPendingTasks", 2147483647));
因此,您可以通过设置该系统属性来控制Verticles前面的队列大小。
如果事件总线已满(NioEventLoop中的队列达到最大大小),则任务将被拒绝。因此,如果您遇到了这种情况,则应该开始看到对消息的错误响应,而不会看到任何阻塞的生产者。