Краткий ответ: Делай простую вещь и не ограничивайся отправкой.
Длинный ответ:
Очередь сообщений действительно заполнится только тогда, когда на диске, для которого она сохранена, не хватает места - в то же время, когда в журнале будет недостаточно места. Очередь сообщений очень хороша для хранения данных, которые вы не готовы обработать. Не дросселировать при отправке. Если вас беспокоит управление системой и дисковое пространство, то вы можете предпочесть использовать превосходные средства мониторинга системы Windows и предупреждения о пороге использования дискового пространства. Вам не нужно изобретать это для вашего приложения.
То есть, если вы не запускаете очередь в режиме «только память», в этом нет необходимости. Если вы не можете обработать сообщения достаточно быстро, у вас определенно будет достаточно времени, чтобы администратор очередей сохранил сообщения на диск. Рассматривать запуск очереди в режиме «только память» следует только в том случае, если вы собираетесь масштабировать до множества пользовательских процессов на многих серверах, а дисковый ввод-вывод в администраторе очередей становится узким местом. Один процесс на той же машине очень далек от этого сценария. Пусть администратор очередей сделает то, что умеет лучше всего. Не оптимизируйте преждевременно.
Если вы реализуете определенное качество обслуживания, например, X сообщений в секунду, и платите своим клиентам больше за обработку более высокого качества обслуживания, чем подавляете на принимающей стороне. Я сделал это успешно, используя семафор, инициализированный с лимитом ресурсов, равным количеству сообщений, потребляемых в секунду. Каждый потребительский поток делал снимок времени начала сообщения, обрабатывал 1 сообщение и затем ждал конца секунды, прежде чем отказаться от семафора. Таким образом, пул потоков может увеличиваться для обеспечения качества обслуживания, если обработка сообщений занимает более 1 секунды, но не превышает качество обслуживания.
Удачи!