使用Reactive X流处理来自Event Hub的数据

时间:2018-01-30 23:14:00

标签: reactive-programming azure-eventhub reactive

我想使用Rx .net扩展来处理来自Azure事件中心的事件。

如何根据从EventProcessorHost获得的消息创建可观察流?

我没有找到这种情况的参考,我在这里遗漏了一些基本的东西吗?我试图做一些没有意义的事情吗?

2 个答案:

答案 0 :(得分:1)

是否有意义取决于你。为什么需要/想要使用Reactive Extensions?大多数情况都涉及使用Azure Stream Analytics近乎实时地转换和查询数据。

但是可以使用EventProcessor来处理数据,这是一个非常粗略的草图,可以帮助您入门:

public class EventProcessor : IEventProcessor
{
    private readonly EventStreamProcessor eventStreamProcessor;

    public EventProcessor(EventStreamProcessor eventStreamProcessor)
    {
        this.eventStreamProcessor = eventStreamProcessor;
    }

    public Task OpenAsync(PartitionContext context)
    {
        return Task.CompletedTask;
    }

    public Task ProcessEventsAsync(PartitionContext context, IEnumerable<EventData> eventDatas)
    {
        foreach(var eventData in eventDatas)
            eventStreamProcessor.Post(eventData);

        return Task.CompletedTask;
    }

    public Task CloseAsync(PartitionContext context, CloseReason reason)
    {
        return Task.CompletedTask;
    }
}

public sealed class EventStreamProcessor : IDisposable
{
    private Subject<EventData> dataStream = new Subject<EventData>();
    private readonly IDisposable subscription;

    public EventStreamProcessor()
    {
        subscription = dataStream
            .Synchronize()
            .AsObservable()
            .Subscribe((evenData) => {
                // Do something
            })
    }

    public void Dispose()
    {
        dataStream.OnCompleted();
        subscription.Dispose();
    }

    public void Post(EventData eventData)
    {
        dataStream.OnNext(eventData);
    }
}

需要考虑的几件事情:

  • 可靠的检查点很难。在将数据推送到RX流之后的任何时刻都可以调用await context.CheckpointAsync();,但您还不知道RX管道是否已经处理了数据。
  • 多个EventProcessor可以在任何给定时刻处于活动状态,因此请确保将数据推送到单个RX流。使用单例或使用IEventProcessorFactory接口的实现
  • 将相同的RX处理器注入每个EventProcessor

我认为这个Q & A的答案也适合你。

答案 1 :(得分:0)

事件中心的实现是Akka.NET反应流Azure EventHub adapter的来源。