Перенос клиента Memcached из Memcached-Java-Client в Xmemcached - PullRequest
2 голосов
/ 12 января 2011

У меня есть старая реализация клиента memcached, основанная на клиенте danga, но слегка измененная.Я думаю, что этот клиент теперь называется Memcached-Java-Client .

Реализация, которая у меня под рукой, старая, не поддерживается и кажется фиктивной.

Мне нужночтобы перенести клиента на новый клиент со следующими ограничениями:

  1. Мне нужен новый алгоритм хеширования клиента, чтобы он был совместим со старым.Если это ограничение не будет выполнено, нам придется сделать сайт (по крайней мере частично) недоступным в течение нескольких часов.
  2. Поддержка различных методов сериализации и возможность расширения для метода сериализации.
  3. Улучшена производительность по сравнению с моим существующим клиентом.
  4. Быть совместимым с Moxi

В текущей реализации используется алгоритм согласованного хеширования, который, кажется, совместим с используемым согласованным хешированием Xmemcached , за исключением того, что я не могу получить попадание в кэш для ключей, сохраненных старым клиентом и извлеченных с помощью клиента Xmemcached.

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

Это код, который я использовал для инициализации клиента xmemcached:

  final MemcachedClientBuilder builder = new XMemcachedClientBuilder(AddrUtil.getAddresses("server:11211 server:11212 server:11213 server:11214"));
  builder.setCommandFactory(new BinaryCommandFactory());
  builder.setSessionLocator(new KetamaMemcachedSessionLocator());
  builder.setTranscoder(new WhalinTranscoder());
  memcachedClient = builder.build();

Я также хочуДайте spymemcached попробовать, если я не могу заставить xmemcached работать, но я предпочитаю позже.

Редактировать: я пробовал spymemcзаболел, и не могу заставить его быть совместимым с моим текущим клиентом.Вот мой код инициализации клиента spymemcached:

final ConnectionFactoryBuilder builder = new ConnectionFactoryBuilder();
builder.setProtocol(Protocol.BINARY);
builder.setTranscoder(WhalinTranscoder());
builder.setHashAlg(HashAlgorithm.KETAMA_HASH);
builder.setLocatorType(Locator.CONSISTENT);
final MemcachedClient client = MemcachedClient(builder.build(), AddrUtil.getAddresses("server:11211 server:11212 server:11213 server:11214"));

Ответы [ 2 ]

1 голос
/ 12 января 2011

Как я понимаю, у вас будет та же проблема, что и в xmemcached с spymemcached. Как я уже отмечал ранее - http://bugs.membase.org/browse/MB-1484, согласованное хеширование, которое вы используете, теперь это взвешенное согласованное хеширование в отличие от других 2, и поэтому вам не хватает некоторых ключей.

0 голосов
/ 16 января 2011

Кажется, что мой старый клиент danga несовместим с клиентами Xmemcached / Spymemcached по простой причине: клиент danga хэширует строки host: port, в то время как более поздние клиенты хэшируют InetSocketAddress, который фактически равен host / IP: port.

Из-за этого я не могу поддерживать совместимость при переходе на новый клиент.Ну, на самом деле и Xmemcached, и Spymemcached клиенты несколько расширяемы и допускают некоторую поддержку в реализации этого, но это будет слишком «хакерским» для моих предпочтений.

Я решил перенести мойкод для использования одного из Xmemcached / Spymemcached в соответствии с результатами тестов.Оба совместимы с алгоритмом хэширования moxi.Я могу в конечном итоге использовать только клиентскую часть moxi - в зависимости от накладных расходов, которые она добавит.Мне больше нравится эта опция, поскольку она значительно упрощает настройку приложения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...