Как я могу реализовать регулирование по значению сообщения с помощью MassTransit? (бэкэнд - это SNS / SQS, но гибкий) - PullRequest
0 голосов
/ 06 мая 2020

Я заинтересован в использовании MassTransit в качестве шины событий, чтобы помочь мне перебрать кеш, но я не уверен, как правильно задросселировать службу.

Ситуация

У меня есть a. Net сервис с API refreshCache(itemId), который пересчитывает кеш для itemId. Я хочу вызывать это всякий раз, когда код в моей организации изменяет любые данные, связанные с itemId.

Однако из-за устаревшего кода у меня может быть 10 событий для данного itemId, сгенерированных в течение той же секунды. Поскольку вызов refreshCache(itemId) стоит дорого, я бы предпочел вызывать его только раз в секунду или около того на itemId .

Например, представьте, что у меня есть 10 событий, генерируемых для item1 а затем отправлено 1 событие для item2. Я бы хотел, чтобы refreshCache вызывался дважды, один раз с item1 и один раз с item2.

Проблемы с MassTransit

Я мог бы отправлять сообщения о событиях, которые, по сути, всего itemId через SNS / SQS, а служба. Net может использовать потребителя MassTransit для прослушивания этой очереди SQS и вызова refreshCache для каждого сообщения. В идеале я также могу дросселировать в SNS / SQS или MassTransit.

Я читал эти документы: https://masstransit-project.com/advanced/middleware/rate-limiter.html и пытался найти промежуточное ПО в коде, но не смог

Кажется, они предполагают, что ограничение скорости просто задерживает доставку сообщений, что означает, что мой refreshCache будет вызываться 10 раз с помощью item1, прежде чем получить вызов с помощью item2 . Вместо этого я бы предпочел, чтобы его вызывали один раз для каждого элемента, в идеале оба сразу.

Точно так же кажется, что SNS и SQS могут либо ограничить скорость доставки по заказу или регулирование на основе очереди , , но не на основе содержимого этой очереди. Для меня было бы невозможно создать отдельные очереди на itemId, так как будет более 100000 различных идентификаторов элементов.

Спрос

Это то, что я пытаюсь сделать, возможно в MassTransit ? Если нет, возможно ли это через SQS? Я также могу проявить творческий подход, используя RabbitMQ или добавляя Lambdas, но предпочел бы, чтобы это было просто.

...