В последнее время начали сравнивать terracotta и memcache. Мне это сравнение кажется некорректным. Бытует мнение что terracotta — это distributed cache1. Это все равно что называть автомобиль “четырехколесным мопедом”, только потому, что он может ездить и у него четыре колеса.

Terracotta часто определяют как Network Attached Memory. И это правда, но не вся. Технически никто не мешает вам использовать terracotta как distributed (или, как его еще иногда называют, clustered) cache. Но тут возникает проблема с HA. В кластере Terracotta всегда есть координатор, который управляет потоком данных. По словам Ari Zilka2 (одного из основателей Terracota Inc.), именно по этой причине terracotta очень хорошо масштабируется, так как благодаря наличию координатора нет необходимости использовать multicast передачу данных. Однако, наличие координатора означает single point of failure. При использовании memcache SPOF нету, но вам необходимо самому распределять данные по нодам.

Используя terracota вы можете взять LinkedBlockingQueue<Runnable>, пометить его как shared и обрабатывать очередь задач на всех нодах кластера. Вместе с корректной имплементацией распределенных локов мы имеем отличную платформу для распределенных вычислений и возможно даже хранения данных.

С кешем все иначе. Его природа имеет несколько особенностей:

  • потерю кеша приложение должно способно пережить (не требуется HA);
  • при работе с кешем можно обойтись без атомарных его обновлений (не требуются атомарные примитивы и локи).

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

Memсache отлично подходит для таких сценариев. Ну а если вы решили использовать memcache как storage, а не как кеш, то вы обречены на собственную реализацию атомарного обновления данных3, как минимум.

Таким образом, memcache и terracotta — это совсем разные вещи. Первое — это просто Network Attached Memory сервер. И без дополнительного кодирования его можно использовать только для кеширования данных. Второе — полноценная платформа для кластеризации вычислений. Как говорится, know your enemy.