Реализовал задачу при помощи Cassandra+Redis. Со вставкой и чтением кассандра справляется на ура! + плюшки по стабильности, реплицированию, шардингу. Теперь надо сделать обработку MapReduce.
Пока мне эта идея очень нравится. Но вот были проблемы, когда я использовал редис на продакшене. Иногда мне прилетали ошибки типа "Redis has gone away". Тогда я не особо уделял этому внимание, так как это всего-лишь кэш. Я просто понизил TTL, проблемы ушли. Тогда БД занимала где-то 80ГБ, что больше, чем размер озу. Как быть со стабильностью?
Дело в том, что архивных данных нет. Все записи могут быть запрошены примерно с одинаковой вероятностью. В mysql сейчас эта табличка весит 7Гб (правда, там пока есть индексы). Это 18млн записей. Тогда по идее, для 32гб озу мне получится хранить примерно 100млн записей. Неплохо)
Хотя, тут встаёт вопрос. Redis держит все данные в ОЗУ, при этом синхронизирует с ПЗУ. Но данных то очень много, слишком расточительно их постоянно держать в ОЗУ. Может ли Redis держать только часть данных в ОЗУ (вроде кеша)?
Идентификатор в виде хеша нужен для связи с СУБД полнотекстового поиска. Коллизии пока не так страшны, хотя понимаю, что нужно думать наперёд. Встаёт вопрос: как фильтр Блума поможет избегать коллизий (по Вашему ответу это звучит так)?
Java -- хорошая штука, мой любимый язык, но он всё равно будет уступать в производительности полностью компилируемым программам. И, к тому же, на Java менее рационально используется память, нежели на C/C++ (хотя всё зависит большей частью от программиста, особенно на C).
Но HBase и Cassandra мне понравились, нужно будет попробовать.
Таблица (коллекция) всего одна. Таблица нормализована максимально, чтобы не иметь каких-то реляционных зависимостей. Очень важна скорость выборки, а JOIN-ы априори будут медленнее, чем их отсутствие.
Станислав Макаров: Спасибо, я примерно так и думаю, но не получается до конца в голове всё уложить)
А где будет оказываться результат перекодировки каждого байта koi8? На месте оригинального байта?
И как мне тогда их переводить в UTF8? Ведь, у кириллических символов UTF8 размер 2 байта.
Станислав Макаров: Так вот не понятно, что с этим объектом делать. В документации пишут, что метод base_converter::to_unicode "Convert a single character starting at begin and ending at most at end to Unicode code-point.". Если он конвертирует single character, то для чего ему тогда длина строки? И даже после того как он сконвертирует, что именно он возвращает? И что он делает с первым аргументом?
TheRishka: Observer тоже не этот случай. Он реализует подписку на события и вызов этих событий. А у меня тут всего-лишь маленькая проверочка) Не буду же я сервис уведомлять о каждом включении/выключении Activity и заставлять его отслеживать активность.
TheRishka: это не совсем то. Как я понимаю, этот паттерн используется для связи программ(ы) из разных процессов. У меня же работа идёт в одном процессе. Binder'ы можно использовать в таком случае и без AIDL. Но Binder позволяет кому-то (Activity) подключаться к сервису, а не наоборот. Можно, конечно, передавать сервису ссылки на себя (Activity). Тогда если ссылки будут слабыми, их можно хранить в сервисе. Тогда получается практически то же, что и со статическими полями... Хотя, на мой взгляд, немного элегантнее.
Есть фрагмент переписки. А сервис принимает сообщения от сервера. Если переписка не на экране или не с собеседником, от которого пришло сообщение в сервис, то вызываем Notification.