Я бы не стал основывать свое решение на томе или по соображениям производительности / масштабируемости. Вы не получите большого выигрыша, если получите какую-либо выгоду от производительности, если объединить их или разделить. Любая группировка или фильтрация, которые могут быть выполнены, когда службы сгруппированы одним способом, также могут быть выполнены с услугами, сгруппированными другим способом. Возможность разделения между серверами тоже будет одинаковой.
Дизайн
Вместо этого я бы сосредоточился на том, чтобы сделать ваш код понятным и понятным. Сгруппируйте ваши сервисы так, как они наиболее удобны для вашей программы. Сохраняйте их логически сгруппированными так, как они наиболее целесообразно группировать с точки зрения проблемной области (в отличие от перспективной области решения).
Поскольку вы можете группировать их по своему усмотрению, я рекомендую вам прочитать SOLID , который представляет собой набор руководящих принципов для создания архитектуры программного обеспечения.
Одним из перечисленных принципов, который особенно важен, является Принцип разделения интерфейса , который можно определить как the notion that "many client specific interfaces are better than one general purpose interface."
Производительность и масштабируемость
Поскольку вы упомянули о производительности и масштабируемости, я рекомендую вам придерживаться следующего плана:
- Определите, как долго вы можете ждать, пока сможете исправлять / поддерживать программное обеспечение
- Определите ожидаемую нагрузку, включая как среднюю, так и пиковую нагрузку за время (вы определили среднее значение), и насколько вы ожидаете, что этот трафик будет расти со временем (в частности, за период, который вы можете использовать без исправления / обслуживания программное обеспечение)
- Создать модель, описывающую, какие именно вызовы будут выполняться и в каких соотношениях (по времени и по серверу)
- Создайте автоматизацию, которая максимально точно отражает эти модели. Попробуйте смоделировать как средний, так и пиковый трафик и превзойти ваш самый высокий масштаб трафика
- Профилируйте свой код, базу данных, сетевой трафик и дисковый трафик при выполнении этой автоматизации
- Определить узкие места, и если они находятся в допустимых пределах
- Оптимизируйте свои узкие места (при необходимости) и повторите с шага профилирования вперед
- Следующий выпуск вашего программного обеспечения, повторите сверху вниз, чтобы добавить сценарии / загрузка / автоматизация
- Выполните регрессионное тестирование с использованием существующих тестов, измененных в соответствии с новой шкалой