graylog RawMessage&RawMessageEvent&MessageEvent&Message 说明
RawMessage 是从graylog input 组件获取到的还没解析处理的消息,是有SimpleChannelInboundHandler 处理的原始消息
RawMessageEvent 是Disruptor 处理的事件包装
MessageEvent 是经过input 之后到ProcessBuffer 中的消息事件(Disruptor 包装的)
Message 是经过input 以及ProcessBufferProcessor 之后生成的消息
参考图
MessageEvent 是包含了RawMessage 以及message经过Disruptor 的事件
RawMessage参考代码
@Override
protected void channelRead0(ChannelHandlerContext ctx, ByteBuf msg) throws Exception {
final byte[] bytes = new byte[msg.readableBytes()];
msg.readBytes(bytes);
final RawMessage raw = new RawMessage(bytes, (InetSocketAddress) ctx.channel().remoteAddress());
input.processRawMessage(raw); // 会通过MessageInput 进行处理,会放到inputbuffer 中
}
RawMessageEvent 参考代码
@Inject
public InputBufferImpl(MetricRegistry metricRegistry,
BaseConfiguration configuration,
Provider<DirectMessageHandler> directMessageHandlerProvider,
Provider<RawMessageEncoderHandler> rawMessageEncoderHandlerProvider,
Provider<JournallingMessageHandler> spoolingMessageHandlerProvider) {
// 基于Disruptor的事件包装,是由 RawMessage 产生的,具体可以通过
final Disruptor<RawMessageEvent> disruptor = new Disruptor<>(
RawMessageEvent.FACTORY,
configuration.getInputBufferRingSize(),
threadFactory(metricRegistry),
ProducerType.MULTI,
configuration.getInputBufferWaitStrategy());
disruptor.setDefaultExceptionHandler(new LoggingExceptionHandler(LOG));
final int numberOfHandlers = configuration.getInputbufferProcessors();
if (configuration.isMessageJournalEnabled()) {
LOG.info("Message journal is enabled.");
final RawMessageEncoderHandler[] handlers = new RawMessageEncoderHandler[numberOfHandlers];
for (int i = 0; i < numberOfHandlers; i++) {
handlers[i] = rawMessageEncoderHandlerProvider.get();
}
disruptor.handleEventsWithWorkerPool(handlers).then(spoolingMessageHandlerProvider.get());
} else {
LOG.info("Message journal is disabled.");
final DirectMessageHandler[] handlers = new DirectMessageHandler[numberOfHandlers];
for (int i = 0; i < numberOfHandlers; i++) {
handlers[i] = directMessageHandlerProvider.get();
}
disruptor.handleEventsWithWorkerPool(handlers);
}
ringBuffer = disruptor.start();
incomingMessages = metricRegistry.meter(name(InputBufferImpl.class, "incomingMessages"));
safelyRegister(metricRegistry, GlobalMetricNames.INPUT_BUFFER_USAGE, new Gauge<Long>() {
@Override
public Long getValue() {
return InputBufferImpl.this.getUsage();
}
});
safelyRegister(metricRegistry, GlobalMetricNames.INPUT_BUFFER_SIZE, constantGauge(ringBuffer.getBufferSize()));
LOG.info("Initialized {} with ring size <{}> and wait strategy <{}>, running {} parallel message handlers.",
this.getClass().getSimpleName(),
configuration.getInputBufferRingSize(),
configuration.getInputBufferWaitStrategy().getClass().getSimpleName(),
numberOfHandlers);
}
MessageEvent 参考处理
ProcessBuffer.java 通过inputbuffer 放到 ProcessBuffer 中
public void insertBlocking(@Nonnull RawMessage rawMessage) {
final long sequence = ringBuffer.next();
final MessageEvent event = ringBuffer.get(sequence);
event.setRaw(rawMessage);
ringBuffer.publish(sequence);
afterInsert(1);
}
Message 提供的能力
后续MessageProcessor 处理的就是此类,同时后续的output 也是使用的此消息进行存储处理
参考资料
https://github.com/Graylog2/graylog2-server/blob/626be1f0d80506705b5ba41fbea33c2ec0164bc0/graylog2-server/src/main/java/org/graylog2/plugin/journal/RawMessage.java
https://github.com/Graylog2/graylog2-server/blob/626be1f0d80506705b5ba41fbea33c2ec0164bc0/graylog2-server/src/main/java/org/graylog2/plugin/Message.java
https://github.com/Graylog2/graylog2-server/blob/626be1f0d80506705b5ba41fbea33c2ec0164bc0/graylog2-server/src/main/java/org/graylog2/shared/buffers/RawMessageEvent.java
https://github.com/Graylog2/graylog2-server/blob/626be1f0d80506705b5ba41fbea33c2ec0164bc0/graylog2-server/src/main/java/org/graylog2/plugin/inputs/MessageInput.java
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)
2020-10-05 drill 学习 九 drill性能优化-Metastore
2020-10-05 apache iceberg 用于分析庞大数据集的开放格式
2020-10-05 drill 学习 八 drill information schema
2020-10-05 drill 学习 五 配置说明- 多租户
2019-10-05 cloudevents 通用event 描述指南
2017-10-05 fn project 试用之后的几个问题的解答
2017-10-05 fn project 扩展