2015-10-24 1 views
3

Мы пишем приложение чата, частично в node.js. Мы ожидаем 1000 вложений (сообщений) в секунду, поэтому наш подход заключался в том, чтобы писать redis (используя lrange для каждой комнаты), а также иметь список в redis, называемый not_saved_messages, который выполняет другой процесс и записывает в MySQL , Это анти-шаблон? Должны ли мы просто писать в MySQL и надеяться, что это задержит?Использование redis в качестве посредника перед вставкой MySQL

+1

Не похож, как анти-паттерн и практический способ борьбы с очередями вставок. Вы в основном используете Redis в качестве очереди сообщений. Вероятно, я хочу следить за задержкой, поскольку в зависимости от того, какие части вашего приложения используются из хранилища MySQL, латентность может повлиять на опыт пользователя или ожидания. Похоже, что это разумный подход. –

ответ

3

Я не думаю, что это обязательно антипаттерн, если это хорошо сделано. Черт, конечно, в деталях.

Что вы пытаетесь сделать, это использовать mysql для ведения журналов и redis для живой информации, не так ли? Мне кажется, что это может сработать. Вопрос заключается в том, как сделать трубопровод цельной функцией.

BTW, большое количество пользователей данных используют что-то очень близкое к этому результату. Например, CERN использует ряд решений NoSQL во время обработки данных, прежде чем данные перейдут в rdbms (Oracle, PostgreSQL или MySQL). Но это определенно продвинутая территория дизайна.

+2

Я думаю, вы можете сказать, что это больше, чем просто регистрация, так как некоторые из более сложных функций приложения будут обрабатываться в MySQL. Вполне возможно, что Redis может справиться со всем этим, но есть дискомфорт в использовании Redis для хранения всех данных. Кроме того, часть, охваченная Redis, является небольшим подмножеством большего приложения. Я надеюсь, что в этом есть смысл. – StackOverflowed

2

Вместо того, чтобы вставлять данные непосредственно, вы можете сначала его сохранить в Redis. Затем второй процесс может взять его из Redis и вставить в базу данных , одну «часть данных» за раз. Недостатком здесь является то, что у вас понадобится достаточно памяти для Redis.

// PHP program code 
//... 
// assuming $r is already connected Redis() instance. 
$r->sadd("data_pipe", serialize($data)); 

Затем

// Open connection to the database 
open_data_connection(); 

$r = new Redis(); 
$r->connect("127.0.0.1", "6379"); 

while(true){ 
    while($xdata = $r->spop("data_pipe")){ 
     $data = unserialize($xdata); 

     // store the data 
     store_data($data); 
    } 

    // No more data 
    sleep(30); 
} 

Если база данных не может угнаться, например, вставляйте данные так же быстро, как появляются новые данные , вы всегда можете начать процесс получения дважды или более, или сделать какой-то осколок, импортируя данные в 2-3 базы данных.

http://redis4you.com/code.php?id=016

Смежные вопросы