У меня есть один сервер memcached. Я использую libmemcached C API для взаимодействия с ним. Я использую неблокирующий режим и режим без ответа (флаги поведения).
Я также использую libmemcached внутри модуля C nginx, если это помогает.
Проблема в том, что memcached_mget блокируется, то есть для сервера с задержкой около 40 мс выполнение memcached_mget занимает 40 мс. Это не совсем асинхронно.
Вот код, который я использую:
const char* localKeys[2] = {"key1", "key2"};
size_t k_length[2] = {4, 4};
gettimeofday(&t1, NULL);
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "no block: %d ", memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NO_BLOCK));
ngx_log_debug1(NGX_LOG_DEBUG_HTTP, log, 0, "no reply: %d ", memcached_behavior_get(memc, MEMCACHED_BEHAVIOR_NOREPLY));
retFt = memcached_mget(memc, localKeys, k_length, 2);
gettimeofday(&t2, NULL);
ngx_log_debug2(NGX_LOG_DEBUG_HTTP, log, 0, "memcached_mget duration (microseconds): %d, result : %d", t2.tv_usec - t1.tv_usec, retFt);
retFt = memcached_fetch_execute(memc, fp, &callback_struct, 1);
Я использую протокол ASCII. Пробовал использовать двоичный код, но это не помогло. Я также пробовал memcached_mget_execute. Я имитирую задержку с помощью tc, например:
tc qdisc add dev lo root netem delay 20ms