Заблаговременно я знаю HBase намного лучше, чем Кассандру. Некоторые аспекты моего ответа относятся к HBase, и я отмечу их как таковые.
Если вы предоставите достаточно оборудования, то реализация BigTable, такая как Cassandra или HBase, даст вам следующее:
- Возможность хранить и получать ваши запросы с очень высокой скоростью
- Способность поглощать удаления с чрезвычайно высокой скоростью (хотя с HBase и Cassandra очистка записи на диск может вызывать периодические задержки)
Тривиально, я мог видеть схему, в которой вы использовали комбинацию идентификатора ресурса в качестве ключа строки и идентификатора учетной записи и, возможно, метку времени в качестве ключа столбца, но (в частности, в HBase) это может привести к появлению горячих точек на серверах, на которых размещены некоторые популярные ресурсы (как в HBase, так и в Cassandra один сервер отвечает за размещение главной копии любой строки за раз). В Cassandra вы можете уменьшить накладные расходы на обновления, используя асинхронные записи (запись только на один или два узла и позволяя сплетням реплицировать их), но это может привести к тому, что старые записи будут значительно длиннее, чем вы ожидаете в ситуациях, когда сетевой трафик высоко. В HBase записи всегда согласованы и всегда записываются на RegionServer, на котором размещена строка, поэтому «горячая точка», безусловно, является потенциальной проблемой.
Вы можете уменьшить влияние хотспоттинга, сделав ключ строки комбинацией идентификатора ресурса и идентификатора учетной записи, но затем вам нужно отсканировать все ключи строки, чтобы определить список учетных записей, которые имеют невыполненные запросы для ресурса.
Еще одно потенциальное преимущество, которое вы, возможно, не учли, - это потенциальная возможность запуска ваших запросов непосредственно из узлов данных HBase или Cassandra, что избавляет вас от необходимости снова отправлять запрос по сети в процесс-исполнитель, чтобы фактически выполнить этот запрос. запрос. Возможно, вы захотите заглянуть в HBase Coprocessors или Cassandra Plugins , чтобы сделать что-то подобное. В частности, я говорю о превращении этого рабочего процесса:
/-> Query -> Executor -> Resource -> Results -> \
Client -> Query -> Query Storage --> Query -> Executor -> Resource -> Results -> --> Client
\-> Query -> Executor -> Resource -> Results -> /
в нечто вроде:
/-> Query -> Resource -> Results -> \
Client -> Query -> Query Storage --> Query -> Resource -> Results -> --> Client
\-> Query -> Resource -> Results -> /
Это может не иметь смысла в вашем случае использования.