如何对异步接收数据的hazelcast喷射源进行编程

时间:2018-09-24 01:31:22

标签: hazelcast-jet

我一直在浏览hazelcast-jet文档,以查找对源的引用,这些源是由某些外部过程异步馈送的-在我的情况下,这将是http帖子。

我确实查看了Kafka code,因为这似乎是最接近的,但无法弄清楚新到达的事件将如何触发任何事件。我认为这里不会涉及阻塞线程。

对于能更好地理解在“流”元素被滴入的环境中如何使用榛子喷射的任何指针,我将不胜感激。

1 个答案:

答案 0 :(得分:1)

即将推出的Hazelcast Jet 0.7版本引入了Source Builder对象,这使构建自定义源变得更加简单。您可以使用它编写类似于以下内容的代码:

public static void main(String[] args) {
    Pipeline pipeline = Pipeline.create();
    StreamSource<String> source = SourceBuilder
            .timestampedStream("http-trickle", x -> new HttpSource())
            .fillBufferFn(HttpSource::addToBuffer)
            .destroyFn(HttpSource::destroy)
            .build();
    StreamStage<String> srcStage = pipeline.drawFrom(source);
}

private static class HttpSource {
    private final BlockingQueue<String> queue = new LinkedBlockingQueue<>(10000);
    private final ArrayList<String> buffer = new ArrayList<>();
    private final AsyncClient<String> client = 
        new AsyncClient<String>().addReceiveListener(queue::add);

    void addToBuffer(TimestampedSourceBuffer<String> sourceBuffer) {
        queue.drainTo(buffer);
        for (String line : buffer) {
            sourceBuffer.add(line, extractTimestamp(line));
        }
        buffer.clear();
    }

    void destroy() {
        client.close();
    }
}

在这里,我使用了一个模拟AsyncClient,该模拟应该代表您实际的异步HTTP客户端。它希望您提供一个回调,该回调将在到达时处理传入的数据。 Jet的源构建器要求您提供另一个回调fillBufferFn,该回调将数据发送到处理管道。

您对AsyncClient的回调应将数据推送到并发队列,而您的fillBufferFn应将队列消耗到Jet的源缓冲区。

您可能会想简化我为此提供的代码:

void addToBufferDirect(TimestampedSourceBuffer<String> sourceBuffer) {
    for (String line; (line = queue.poll()) != null;) {
        sourceBuffer.add(line, extractTimestamp(line));
    }
}

这避免了中间缓冲区位于并发队列和Jet的源缓冲区之间。实际上,它在大多数时候都可以使用,但是如果您遇到了高峰流量,addToBufferDirect可能永远不会完成。这将违反与Jet的合同,这要求您在一秒钟左右的时间内从fillBufferFn返回。

我们已经认识到这种将源构建器与异步客户端API结合使用的模式非常普遍,我们计划为处理它提供更多便利。