Ради хорошей практики я бы разбил API на отдельные интерфейсы, чтобы у вас была возможность разбить их на отдельные реализации в будущем. Вы все еще можете иметь только один класс обслуживания, реализующий все интерфейсы, например:
public class RestService : ICustomer, IProducts, IOrders
Тем не менее, звучит так, как будто вы все равно захотите сделать их отдельными реализациями.
Что касается параметров параллелизма, спросите себя, какие ресурсы необходимо использовать для каждого вызова. Если конструктор вашего класса обслуживания может быть написан без какого-либо длительного запуска, используйте PerCall. Если вам нужно инициализировать дорогие ресурсы, я бы порекомендовал InstanceContextMode.Single с ConcurrencytMode.Multiple и обязательно написал бы потокобезопасный код. Например: убедитесь, что вы заблокировали () любые свойства класса или другие общие ресурсы, прежде чем использовать их.
Соединения с базой данных не будут считаться "дорогими для инициализации", потому что ADO сделает пул соединений для вас и устранит эти издержки.
Ваши настройки регулирования будут показаны при тестировании, как упоминает Ладислав. Вы хотели бы провести стресс-тестирование своего сервиса и использовать результаты, чтобы получить представление о том, сколько машин потребуется для обслуживания ожидаемой нагрузки. Затем вам понадобится специальный балансировщик нагрузки для маршрутизации запросов в виде циклического перебора или проверки состояния каждого сервера. Балансировщики нагрузки можно настроить, чтобы ПОЛУЧИТЬ страницу «systemhealth.asp» и проверить результаты. Если вы вернете «ОК», то этот компьютер останется в пуле или может быть временно удален из пула, если он отключился или вернул какой-либо другой статус.
Ваша привязка должна быть WebHTTPBinding для REST. BasicHTTPBinding предназначен для интерфейсов SOAP и не поддерживает, например, [WebGet].
Если это не обязательно должен быть сервис REST, то вы можете получить немного больше производительности, используя NetTcpBinding.