Разве SendMessage не должен быть независимым от того, насколько занят шард, и я должен иметь возможность ставить в очередь все, основываясь на скорости моего сетевого соединения, а не на том, насколько занят шард?
MongoDB не не использует буфер, но операционная система / сетевой стек имеет его для всего сетевого трафика ( и по сокету / соединению ).
То, о чем вы на самом деле говорите, это сетевой буфер сервера шарда. Вы говорите «Эй, это не имеет значения, если вы заняты, просто примите этот запрос» . Однако сетевой буфер не бесконечно длинный. В какой-то момент буфер будет заполнен, и это соединение просто перестанет принимать больше данных, пока не очистится.
Если вы находитесь в точке, где вы отправляете больше операций / данных, чем может обработать один осколок, у вас есть ограниченное количество опций:
- Больше оборудования (disk / mem) => больше осколков => меньше нагрузки на один осколок
- Дважды проверьте распределение ключей вашего шарда (, хотя изменить почти невозможно )
- Попробуйте ручную блокировку , чтобы облегчить нагрузку
К сожалению, ни одно из этих решений не является простым. MongoDB великолепен тем, что предоставляет возможность разделения данных. Но у него нет автоматизированных функций для обработки «горячих» узлов. Если вы знаете, какие чанки горячие, вы можете разделить их, и балансировщик переместит их, но не существует автоматического процесса, который сделает это за вас, если данные в чанке не изменились.