Мы создаем крупномасштабный веб-сайт электронной связи для обслуживания более 100 000 пользователей, но мы ожидаем, что число пользователей будет быстро расти в течение первого года. В целом, функции сайта очень похожи на ebay, где пользователи могут создавать, обновлять и удалять списки. Пользователь также может искать в списках и покупать интересующий товар. По сути, в системе есть транзакционные и нетранзакционные требования:
**Transactional**
Create a listing (multi-record update)
Remove a listing
Update a listing
Purchase a listing (multi-record update)
**Non-Transactional**
Search listings
View a listing
Мы хотим использовать мощь масштабируемых хранилищ данных NoSQL на основе документов, таких как Couch или MongoDB, но в то же время нам нужно реляционное хранилище для поддержки наших транзакционных требований ACID. Поэтому мы придумали гибридное решение, в котором используются обе технологии.
Поскольку сайт «в основном читается», и для удовлетворения потребностей в масштабируемости мы создали хранилище данных MongoDB. Для транзакционных нужд мы настроили MySQL Cluster. В качестве промежуточного компонента мы используем кластер серверов приложений JBoss.
Когда приходит «поисковый» запрос, JBoss направляет запрос в Mongo для обработки поиска, который должен давать очень быстрые результаты, не нагружая MySQL. Когда листинг создается, обновляется, удаляется или покупается, JBoss обслуживает транзакции с MySQL. Чтобы поддерживать синхронизацию MongoDB и MySQL, все транзакционные запросы, обрабатываемые JBoss к MySQL, должны включать последний шаг в бизнес-логике, который обновляет соответствующий документ в MongoDB через идентификатор листинга; мы планируем использовать Java API MongoDB для облегчения этой интеграции обновления документа.
Итак, по сути, поскольку сайт в основном читается, архитектура позволяет нам горизонтально масштабировать MongoDB для размещения большего количества пользователей. Использование MySQL позволяет нам использовать свойства ACID реляционных баз данных, сохраняя при этом наше хранилище MongoDB обновленным с помощью промежуточного программного обеспечения JBoss.
Что-то не так с этой архитектурой? Ни одна платформа не может одновременно обеспечивать согласованность, доступность и устойчивость к разделам — системы NoSQL обычно отказываются от согласованности — но, по крайней мере, с помощью этого гибридного подхода мы можем реализовать все три за счет дополнительной сложности системы, и мы с этим все в порядке, так как все наши требования выполняются.