/// <summary> /// Construct a Producer class. /// </summary> /// <param name="brokerRouter">The router used to direct produced messages to the correct partition.</param> /// <param name="maximumAsyncRequests">The maximum async calls allowed before blocking new requests. -1 indicates unlimited.</param> /// <param name="maximumMessageBuffer">The maximum amount of messages to buffer if the async calls are blocking from sending.</param> /// <remarks> /// The maximumAsyncRequests parameter provides a mechanism for minimizing the amount of async requests in flight at any one time /// by blocking the caller requesting the async call. This affectively puts an upper limit on the amount of times a caller can /// call SendMessageAsync before the caller is blocked. /// /// The MaximumMessageBuffer parameter provides a way to limit the max amount of memory the driver uses should the send pipeline get /// overwhelmed and the buffer starts to fill up. This is an inaccurate limiting memory use as the amount of memory actually used is /// dependant on the general message size being buffered. /// /// A message will start its timeout countdown as soon as it is added to the producer async queue. If there are a large number of /// messages sitting in the async queue then a message may spend its entire timeout cycle waiting in this queue and never getting /// attempted to send to Kafka before a timeout exception is thrown. /// </remarks> public Producer(IBrokerRouter brokerRouter, int maximumAsyncRequests = MaximumAsyncRequests, int maximumMessageBuffer = MaximumMessageBuffer) { BrokerRouter = brokerRouter; _protocolGateway = new ProtocolGateway(BrokerRouter); _maximumAsyncRequests = maximumAsyncRequests; _metadataQueries = new MetadataQueries(BrokerRouter); _asyncCollection = new AsyncCollection <TopicMessage>(); _semaphoreMaximumAsync = new SemaphoreSlim(maximumAsyncRequests, maximumAsyncRequests); BatchSize = DefaultBatchSize; BatchDelayTime = TimeSpan.FromMilliseconds(DefaultBatchDelayMS); _postTask = Task.Run(() => { BatchSendAsync(); BrokerRouter.Log.InfoFormat("ending the sending thread"); }); }
public ManualConsumer(int partitionId, string topic, ProtocolGateway gateway, string clientId, int maxSizeOfMessageSet) { if (string.IsNullOrEmpty(topic)) { throw new ArgumentNullException("topic"); } if (gateway == null) { throw new ArgumentNullException("gateway"); } if (maxSizeOfMessageSet <= 0) { throw new ArgumentOutOfRangeException("maxSizeOfMessageSet", "argument must be larger than zero"); } _gateway = gateway; _partitionId = partitionId; _topic = topic; _clientId = clientId; _maxSizeOfMessageSet = maxSizeOfMessageSet; }