Я занимался этой проблемой в прошлом, но все же чувствую, что мне есть чему поучиться на поле. Я считаю, что это одна из самых интересных областей, которые существуют в настоящее время в разработке программного обеспечения, вот некоторые соображения по этому поводу:
MySQL является достаточно справедливой базой данных, если вы не работаете с огромным объемом данных, и в этом случае вы можете рассмотреть NoSQL базы данных, но вы должны тщательно изучить, какая база данных NoSQL лучше всего подходит для ваших нужд.
Вы должны внедрить кеширование в своей системе - попытаться кешировать как можно больше данных только для чтения или определить некоторые стратегии кеширования - например, у нас был сценарий, в котором для пользователя было бы допустимо видеть «старые данные» как пока последнее обновление имело место в последний час.
Я хотел бы рассмотреть JBoss Cache, или, возможно, Infinispan (который больше похож на распределенную структуру данных) или другую популярную инфраструктуру кэширования для этого.
Кроме того, как вы упомянули tomcat, я предполагаю, что вы работаете в каком-то модуле запроса-ответа. Попробуйте рассмотреть возможность использования кэша, который существует в области данного запроса, это может быть даже простой HashMap, связанный с локальным хранилищем потока .
Моя идея здесь очень напоминает кеш первого уровня в Hibernate .
Вы должны помнить, что файлы, транзакции и другие ресурсы стоят дорого с точки зрения их сохранения. Убедитесь, что вы закрываете файлы и транзакции как можно скорее, иначе у вас появятся ошибки, которые будут воспроизводиться при крупномасштабных настройках
Кроме того, вы должны понимать, что 2000 одновременно работающих пользователей - означает ли это, что 2000 пользователей одновременно получают доступ к вашему серверу, или они используют вашу систему? Различают случаи, когда 2000 пользователей пытаются открыть сокет для вашего сервера, и случаи, когда только 500 и 1500 в настоящее время рассматривают результаты заполнения ввода на стороне клиента.
Вы должны рассмотреть возможность использования кластеризации - вам придется иметь дело с такими проблемами, как балансировка нагрузки , зависание сеанса (что означает, что балансировщик нагрузки перенаправит запрос на тот же сервер для того же сеанса) и многое другое.
Если вам нужен код синхронизации - тщательно выбирайте стратегию синхронизации. Я видел некоторые системы, в которых использовалась простая блокировка, но ReaderWriterLockмогло бы улучшить положение вещей, так как большая часть доступа была доступна только для чтения.
Рассмотрите возможность кэширования и проверки на стороне клиента, если это возможно, попробуйте сохранить вызовы на сервере и отправлять только различия данных, если большая часть вашего ответа на запрос с тем же параметром не изменится.
Например, в проекте с открытым исходным кодом oVirt мы запрашиваем статистику данной виртуальной машины. некоторые данные виртуальной машины редко изменяются, поэтому мы отправляем только MD5, если данные изменяются, значение MD5 также изменяется, мы выполняем запрос для получения полных данных, а не только MD5.
Я уже упоминал о спящем режиме - я бы порекомендовал вам тщательно рассмотреть возможность его использования - если вам нужно выполнять много записей и меньше чтений, Hibernate может не подойти вам, и вам следует подумать, возможно, работа с Spring-JDBC в качестве оболочки над JDBC.
Мудро индексируйте свою базу данных и используйте правильную схему БД. Подумайте об использовании слоя хранимых процедур, так как они предварительно скомпилированы и оптимизированы.
Я хотел бы заявить, что в прошлом я имел дело с системой (один узел) на mysql (в основном доступ только для чтения) с jboss 4.2.1 и смог достичь 2000 одновременных пользователи
(не получая доступ сразу с точки зрения открытия 2000 сокетов на нашем сервере), но используя / просматривая нашу систему, используя JBoss Cache и предварительно загружая в кеш некоторые наиболее часто используемые данные, или данные, которые мы поняли, будут «горячими и популярными» «но наше решение было хорошо для нашей архитектуры и наших потоков,
поэтому, как я уже говорил в этих случаях, -
есть еще советы и рекомендации, но они действительно зависят от вашей архитектуры и от того, какие потоки вам нужны в вашей системе». Удачи!