Выбор платформы для работы RethinkDB
Твёрдо решив что всё таки стоит попробовать использовать RethinkDB в качестве базы данных, я задался какой же платформой воспользоваться для создания REST API.
Раннее я сравнивал RethinkDB c Mysql на различных платформах. Тест был тривиален и содержал лишь в себе инициацию соединения с БД и один запрос на выборку данных.
NodeJS или Go
На графике понятно только одно, что “только не PHP”. Хотя PHP7 весьма неплох.
Теперь пора провести более серьёзный тест на вставку, выборку и удаление данных. За основу я возьму архив изменений валютного курса с kurs.kz
В файле имеются 4114 значений такого вида.
[{
"id": "2",
"newdate": "1095206400",
"usd_buy": "135.4500",
"usd_sell": "135.9500",
"eur_buy": "165.2500",
"eur_sell": "166.8500",
"rur_buy": "4.6000",
"rur_sell": "4.6500"
},
... ]
NodeJS
NodeJS множественная вставка (bulk insert)
time curl localhost:3000/insert
real 0m0.811s
user 0m0.004s
sys 0m0.004s
NodeJS выборка
Без обработки результатов
Т.е первый отклик системы после запроса
r.table('archive').run(conn, function(err, res){
if(err) throw err;
response.end();
});
time curl localhost:3000/select
real 0m0.077s
user 0m0.008s
sys 0m0.000s
С обработкой результатов (toArray)
r.table('archive').run(conn, function(err, res){
if(err) throw err;
res.toArray(function(err, data){
console.log(err,data.length)
response.end();
});
});
time curl localhost:3000/select
real 0m0.201s
user 0m0.004s
sys 0m0.004s
NodeJS массовое удаление
r.table('archive').delete()
time curl localhost:3000/delete
real 0m0.236s
user 0m0.004s
sys 0m0.004s
NodeJS построчное удаление
Здесь уже простым замером времени выполнения запроса не выйдет, так как тут множество асинхронных запросов (4114 шт.). Потому такой “костыль”. (И да я не учитываю время фактического выполнения команды на удаление, лишь сколько занимает “прокрутка” всех данных и запрос на их удаление.)
res.each(function(err, row){
r.table('archive').get(row.id).delete().run(conn);
}, function(){
console.log(+new Date()-start); // Завершение выборки
});
==> 780 ms
Go
Go множественная вставка (bulk insert)
r.DB("test").Table("archive").Insert(archives).Run(session)
[GIN] 2016/03/25 - 11:45:29 | 200 | 482.971048ms | 127.0.0.1 | GET /index
Go выборка с приведением к интерфейсам (массиву)
rows, err := r.DB("test").Table("archive").Run(session)
if err != nil { fmt.Println(err)}
var selectedArchives []Archive
errParse := rows.All(&selectedArchives)
if errParse != nil { fmt.Printf("Error scanning database result: %s", errParse) }
fmt.Printf("%d selectedArchives", len(selectedArchives))
[GIN] 2016/03/25 - 11:51:12 | 200 | 210.791357ms | 127.0.0.1 | GET /select
Go массовое удаление
r.DB("test").Table("archive").Delete().Run(session)
[GIN] 2016/03/25 - 11:47:22 | 200 | 157.572104ms | 127.0.0.1 | GET /delete
Результаты
Они весьма равные. Мне казалось что Go победит с большим отрывом.
P.S
Тесты проводились на машине AMD FX-8320E x 8, 16Gb