Ejemplo n.º 1
0
        public Task <long> WriteEvent(BaseProposedEvent proposedEvent, CancellationToken cancellationToken)
        {
            var task = proposedEvent switch {
                ProposedEvent p => Append(p),
                ProposedMetaEvent => NoOp(),
                ProposedDeleteStream => NoOp(),
                IgnoredEvent => NoOp(),
                _ => throw new InvalidOperationException("Unknown proposed event type")
            };

            return(Metrics.Measure(() => task, ReplicationMetrics.WritesHistogram, ReplicationMetrics.WriteErrorsCount));

            async Task <long> Append(ProposedEvent p)
            {
                var route = _route(p);

                _debug?.Invoke(
                    "Kafka: Write event with id {Id} of type {Type} to {Stream} with original position {Position}",
                    new object[] {
                    proposedEvent.EventDetails.EventId,
                    proposedEvent.EventDetails.EventType,
                    route.Topic,
                    proposedEvent.SourcePosition.EventPosition
                }
                    );

                // TODO: Map meta to headers, but only for JSON
                var message = new Message <string, byte[]> {
                    Key   = route.PartitionKey,
                    Value = p.Data
                };
                var result = await _producer.ProduceAsync(route.Topic, message, cancellationToken).ConfigureAwait(false);

                return(result.Offset.Value);
            }
Ejemplo n.º 2
0
 public SinkContext(
     BaseProposedEvent proposedEvent, CancellationToken cancellationToken
     )
     : base(cancellationToken)
 {
     ProposedEvent = proposedEvent;
 }