Я не уверен, почему пресса в целом говорит, что TrueTime API Google трудно реплицировать (Wired, Slashdot и т. Д.).Почему API TrueTime Google трудно дублировать?
Я могу понять, как было бы трудно получить низкие интервалы ошибок, которые достигнут Google, но я не вижу, как сам API будет очень сложным.
Например, я взломал взломанную вместе версию. Вот интервал.
typedef struct TT_interval {
struct timeval earliest;
struct timeval latest;
} TT_interval;
Вот функция.
int TT_now(TT_interval* interval)
{
struct ntptimeval tv;
struct timeval delta;
struct timeval* earliest_p = &(interval->earliest);
struct timeval* latest_p = &(interval->latest);
struct timeval* now_p = &(tv.time);
struct timeval* delta_p = δ
timerclear(&delta);
timerclear(&interval->earliest);
timerclear(&interval->latest);
if(ntp_gettime(&tv) == 0) {
tv.maxerror = tv.maxerror > 0 ? tv.maxerror : -(tv.maxerror);
delta.tv_sec = delta.tv_sec + (tv.maxerror/1000);
delta.tv_usec = delta.tv_usec + ((tv.maxerror % 1000) * 1000);
if(delta.tv_usec > 1000000) {
delta.tv_usec -= 1000000;
delta.tv_sec++;
}
timeradd(now_p, delta_p, latest_p);
timersub(now_p, delta_p, earliest_p);
} else {
printf("error on ntp_gettime. %s\n", strerror(errno));
return ERROR;
}
return SUCCESS;
}
Наконец, вот до и после того, как функции (которые являются обертками вокруг теперь функции и может использовать немного DRY рефакторинга).
int TT_before(TT_interval* interval, bool* success)
{
struct timeval* latest_p;
struct timeval* earliest_p;
TT_interval now;
if(TT_now(&now) != SUCCESS) {
return ERROR;
}
latest_p = &(interval->latest);
earliest_p = &(now.earliest);
if(timercmp(latest_p, earliest_p, <) != 0) {
*success = true;
return SUCCESS;
} else {
*success = false;
return SUCCESS;
}
return ERROR;
}
int TT_after(TT_interval* interval, bool* success)
{
struct timeval* latest_p;
struct timeval* earliest_p;
TT_interval now;
if(TT_now(&now) != SUCCESS) {
return ERROR;
}
earliest_p = &(interval->latest);
latest_p = &(now.earliest);
if(timercmp(latest_p, earliest_p, <) != 0) {
*success = true;
return SUCCESS;
} else {
*success = false;
return SUCCESS;
}
return ERROR;
}
Я, кажется, получаю интервальные ошибки от 5 000 до 350 000 (используя публичный NTPd). Это далеко от цифр Google, но вам нужно где-то начинать.
Помимо отличной производительности, существует ли главный недостаток в этом дизайне, который предотвратил бы создание чего-то вроде Сппера на вершине?
Мы только что опубликовали новый документ в TrueTime и как он используется - https://cloud.google.com/spanner/docs/true-time-external-consistency –