Как вы используете последовательное хеширование с библиотеками Java эластичной боли?

Я пытаюсь использовать asticache как сервис memcache с клиентской библиотекой asticache AWS для Java.

Следующий код работает для подключения к кластеру:

_client = new MemcachedClient(_serverList);

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

_client = new MemcachedClient(new KetamaConnectionFactory(), _serverList);

или же

ConnectionFactoryBuilder connectionFactoryBuilder = new ConnectionFactoryBuilder();
connectionFactoryBuilder.setLocatorType(Locator.CONSISTENT);
connectionFactoryBuilder.setHashAlg(DefaultHashAlgorithm.KETAMA_HASH);
connectionFactoryBuilder.setClientMode(ClientMode.Dynamic);
ConnectionFactory connectionFactory = connectionFactoryBuilder.build();
_client = new MemcachedClient(connectionFactory, _serverList);

Любая попытка использовать что-либо, кроме ванильного MemcacheClient, приводит к таким ошибкам, как:

2015-04-07 07:00:32.914 ПРЕДУПРЕЖДЕНИЕ net.spy.memcached.ConfigurationPoller: Конфигурация имеет нулевое значение на локальном хосте сервера. 2015-04-07 07:00:32.914 ПРЕДУПРЕЖДЕНИЕ net.spy.memcached.ConfigurationPoller: Количество последовательных опросов количество ошибок 7. Количество минут с момента последнего успешного опроса равно 0.

Также я проверил с помощью telnet, spymecached libs и ванильного конструктора MemcacheClient, что группы безопасности являются разрешающими.

2 ответа

При использовании клиентской библиотеки AWS KetamaConnectionFactory по умолчанию используется "динамический" режим клиента, который пытается опросить список доступных узлов memcached с конечной точки конфигурации. Чтобы это работало _serverList должен содержать только конечную точку конфигурации.

Ваше сообщение об ошибке указывает, что хост был "простым" узлом memcached, который не понимает расширения ElastiCache. Если это то, что вы намереваетесь сделать (указать узлы самостоятельно, а не использовать функцию автообнаружения), то вам нужно использовать несколько аргументов KetamaConnectionFactory конструктор и передать в ClientMode.Static в качестве первого аргумента.

Вам нужно будет использовать метод AddrUtil.getAddresses().

_client = new MemcachedClient(new KetamaConnectionFactory(), AddrUtil.getAddresses("configEndpoint:port"));

или же

ConnectionFactoryBuilder connectionFactoryBuilder = new ConnectionFactoryBuilder(new KetamaConnectionFactory());
// set any other properties you want on the builder
ConnectionFactory connectionFactory = connectionFactoryBuilder.build();
_client = new MemcachedClient(connectionFactory, AddrUtil.getAddresses("configEndpoint:port"));
Другие вопросы по тегам