2009-11-19 1 views
4

Я создаю приложение, которое включает в себя функцию массового тега миллионов записей, более или менее интерактивно. Взаимодействие с пользователем очень похоже на Gmail, где пользователи могут отмечать отдельные электронные письма или массовые теги большого количества электронных писем. Мне также нужен быстрый доступ для чтения к этим членам тегов, и где шаблон чтения более или менее случайный.Стратегия сохранения для низкой латентности читает и пишет

Прямо сейчас мы используем Mysql и вставляем одну строку для каждой пары тегов-документов. Написание миллионов строк в Mysql занимает некоторое время (высокий уровень ввода-вывода), даже при массовых вставках и большой оптимизации. Нам нужно, чтобы это был интерактивный процесс, а не пакетный процесс.

Данные, которые мы храним и считываем, согласованность и доступность данных не так важны, как производительность и масштабируемость. Поэтому, в случае сбоя системы во время записи, я могу справиться с некоторой потерей данных. Однако в определенный момент данные, безусловно, должны быть сохранены для вторичного хранилища.

Таким образом, чтобы подвести итог, вот требования:

  • Низкая латентность сыпучие пишет потенциально десятки миллионов записей необходим
  • Данные, которые будут упорствовать в некотором роде
  • Низкая латентность случайного чтения
  • Прочные запись не требуется
  • Eventual консистенции хорошо

Вот некоторые решения, я посмотрел на:

  • Написать за кэшей (Terracotta, GigaSpaces, когерентность), где записи записываются в память и осушенных в базу данных асинхронно. Меня это немного пугает, потому что они добавляют некоторую сложность в приложение, которое я бы хотел избежать.
  • высоко масштабируемых ключ-значение магазины, как MongoDB, HBase, Tokyo Tyrant

ответ

2

Если у вас есть бюджет для использования Coherence для этого, я настоятельно рекомендую это сделать. Существует прямая поддержка поведения обратной записи, возможного согласования в когерентности, и она очень устойчива как к отключению базы данных, так и к сбоям узла кластера Coherence (если вы используете> = 3 узла Coherence на отдельных JVM, предпочтительно на отдельных хостах). Я реализовал это для выполнения CRM большого объема для сайта электронной коммерции компании Fortune 100, и он работает фантастически.

Одним из лучших аспектов этой архитектуры является то, что вы пишете свой код приложения Java, как если бы ни одна из операций с записью не выполнялась, а затем подключайте топологию и конфигурацию Coherence, которая делает это возможным. Если вам нужно изменить поведение или топологию Coherence позже, никаких изменений в вашем приложении не требуется. Я знаю, что, вероятно, есть несколько разумных способов сделать это, но это поведение напрямую поддерживается в Coherence, а не в том, чтобы изобретать или ручным способом делать это.

Чтобы сделать действительно точную точку - ваше беспокойство о добавлении сложности приложения является хорошим. С Coherence вы просто пишете обновления в кеш (или если вы используете Hibernate, это может быть поставщик кэша L2). В зависимости от конфигурации и топологии Coherence у вас есть возможность развернуть приложение для использования кэшей, распределенных, кэшей. Таким образом, ваше приложение не является более сложным (и, откровенно говоря, незнающим) из-за особенностей кеша.

Наконец, я реализовал решение, упомянутое выше, с 2005-2007 гг., Когда Tangosol был создан Coherence, и у них была лучшая поддержка. Я не уверен, как сейчас дело в Oracle - надеюсь, все еще хорошо.

0

В зависимости от того, как данные организованы, возможно, вы могли бы использовать sharding, если задержка чтения не достаточно низко вы также можно попытаться добавить кеширование. Memcache - одно популярное решение.

1

Я работал над большим проектом, который использовал asyncrhonous, пишет althoguh, в этом случае он был написан только вручную с использованием фоновых потоков. Вы также можете реализовать что-то подобное, выгрузив процесс записи db в очередь JMS.

Одна вещь, которая, безусловно, ускорит запись db, - это делать их партиями. Пакетные обновления JDBC могут быть на порядок быстрее, чем отдельные записи, и если вы делаете их асинхронно, вы можете просто написать их по 500 за раз.

0

Berkeley DB имеет высокопроизводительную хэш-таблицу на основе диска, которая поддерживает транзакции и интегрируется с средой Java EE, если вам это нужно. Если вы можете моделировать данные как пары «ключ/значение», это может быть очень масштабируемое решение.

http://www.oracle.com/technology/products/berkeley-db/je/index.html

(Примечание: Оракул купил Berkeley DB около 5-10 лет назад, оригинальный продукт был вокруг в течение 15-20 лет).

Смежные вопросы