vert.x中事件总线的大小

时间:2018-04-11 15:02:12

标签: java event-handling vert.x

我使用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。如何确认我怀疑发布商线程被阻止?

3 个答案:

答案 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中的队列达到最大大小),则任务将被拒绝。因此,如果您遇到了这种情况,则应该开始看到对消息的错误响应,而不会看到任何阻塞的生产者。