Size: a a a

2020 August 31

AR

Anton Revyako in ctodailychat
я вот, если честно, не решил хочу ли я с pgplsql связываться в анализаторе. есть шанс никогда не доделать больше ничего )
источник

СА

Сергей Аксёнов... in ctodailychat
Anton Revyako
Telegram
Типа крутой бэкендер
Сравнение UUID

Есть два UUID'a:
1) 898b178f-f694-4a78-ac20-3f5c6ab55e77
2) 2eb2c8db-e826-4424-8287-aae6f8d3b8c7

Как думаете, если их сравнить в Java (через стандартный компаратор) и в PostgreSQL - результат будет одинаковый? Проверим?

Java (Kotlin):
first.compareTo(second)

PostgreSQL:
select (:first)::uuid > (:second)::uuid

Результаты:
Java вернет -1, т.е первый меньше второго
PostgreSQL вернет true, т.е первый больше второго

Надеюсь, это избавит кого-то от 4 часов дебага. Проблему нашли, но легче не стало. Давайте разбираться, почему так получилось и кто прав.

Идем в исходники PostgreSQL, находим там метод uuid_internal_cmp, видим что он вызывает C'шный memcmp и сравнивает байтики обоих uuid'ов. Выглядит логично.

Идем в исходники Java. Сначала стоит обратить внимание на то, как в UUID'е хранятся данные.
public final class UUID {
 private final long mostSigBits;
 private final long leastSigBits;
}

Смотрим реализацию метода compareTo(). Копипастить код сюда не буду, покажу лишь коммент:
// The ordering…
А разве над UUID имеет смысл операция больше/меньше?
источник

AR

Anton Revyako in ctodailychat
Сергей Аксёнов
А разве над UUID имеет смысл операция больше/меньше?
вы все сегодня сговорились?) (с) анекдот

uuid это 128 битный инт. с интами имеет смысл больше-меньше?
источник

MS

Max Syabro in ctodailychat
Сергей Аксёнов
А разве над UUID имеет смысл операция больше/меньше?
источник

AR

Anton Revyako in ctodailychat
там есть еще варианты с неймспейсами, например. не помню версию
источник

СА

Сергей Аксёнов... in ctodailychat
Хм, и эти люди запрещают мне ковыряться в MongoDB!
источник

MS

Max Syabro in ctodailychat
Сергей Аксёнов
Хм, и эти люди запрещают мне ковыряться в MongoDB!
не запрещают а осуждают!
источник

СА

Сергей Аксёнов... in ctodailychat
Кстати, к прошлой беседе про Optane: тут бойцы из Монги попробовали Optane в режиме RAM и в режиме SSD (или, по их собственному выражению, с блочным доступом по шине памяти и по шине PCI-e), и вы не поверите, что у них получилось: https://engineering.mongodb.com/post/we-replaced-an-ssd-with-storage-class-memory-here-is-what-we-learned
источник

AR

Anton Revyako in ctodailychat
Сергей Аксёнов
Кстати, к прошлой беседе про Optane: тут бойцы из Монги попробовали Optane в режиме RAM и в режиме SSD (или, по их собственному выражению, с блочным доступом по шине памяти и по шине PCI-e), и вы не поверите, что у них получилось: https://engineering.mongodb.com/post/we-replaced-an-ssd-with-storage-class-memory-here-is-what-we-learned
получилось что монге все-равно ничего не поможет? )
источник

СА

Сергей Аксёнов... in ctodailychat
Anton Revyako
получилось что монге все-равно ничего не поможет? )
Можно и так сформулировать)
источник

AR

Anton Revyako in ctodailychat
Сергей Аксёнов
Можно и так сформулировать)
зацените какая у меня скорость чтения ))))
источник

СА

Сергей Аксёнов... in ctodailychat
Anton Revyako
зацените какая у меня скорость чтения ))))
Кэшируешь небось?
источник

AR

Anton Revyako in ctodailychat
Сергей Аксёнов
Кэшируешь небось?
не, машин лернинг
источник

СА

Сергей Аксёнов... in ctodailychat
Anton Revyako
не, машин лернинг
fun getMongoDBAssesmentByAI(NLRequest: String): String {
   return "MongoDB sucks"
}
источник

AR

Anton Revyako in ctodailychat
Сергей Аксёнов
fun getMongoDBAssesmentByAI(NLRequest: String): String {
   return "MongoDB sucks"
}
exactly
источник

A

Andrey in ctodailychat
Alex
1) Х может привести к проблемам

2) отсутствие Х тоже может привести к проблемам

какой из пунктов выбирать?)
есть два стула....
источник

СА

Сергей Аксёнов... in ctodailychat
Ну окей, вот, например, боевая задачка: сервис "отметки о прочитанном".

Сервис хранит 30 дней истории просмотров юзерами контента строками вида:

user_id int96, content_id string(10), timestamp int32

На базу идёт нагрузка в 10000 RPS на запись блоками от 1 до 10 строк. Итого в таблице постоянно хранится примерно полтора триллиона строк. Понятно, что таблицу надо обрезать не реже чем раз в сутки, при этом не блокируя остальных операций.

Также идёт нагрузка в 3000 RPS запросов вида: "вот список content_id размером не более 1000 элементов, верни мне те из них, которые не были просмотрены юзером user_id", т.е. которых нет в таблице.

Ну и всякая мелочь типа "дай мне историю просмотренного контента для юзера", суммарно скажем ещё на 2000 RPS, для ровного счёта.

Сколько реплик и шардов Постгри нужно для реализации такого сервиса, и с какого раза удастся так его написать, чтобы он отвечал не более чем за 50ms и имел среднее время между инцидентами не менее 3 недель, а время восстановления не более часа?  Вопрос со звёздочкой: как будем делать и хранить бэкапы?
источник

GL

Gleb Lesnikov in ctodailychat
источник

СА

Сергей Аксёнов... in ctodailychat
Сергей Аксёнов
Ну окей, вот, например, боевая задачка: сервис "отметки о прочитанном".

Сервис хранит 30 дней истории просмотров юзерами контента строками вида:

user_id int96, content_id string(10), timestamp int32

На базу идёт нагрузка в 10000 RPS на запись блоками от 1 до 10 строк. Итого в таблице постоянно хранится примерно полтора триллиона строк. Понятно, что таблицу надо обрезать не реже чем раз в сутки, при этом не блокируя остальных операций.

Также идёт нагрузка в 3000 RPS запросов вида: "вот список content_id размером не более 1000 элементов, верни мне те из них, которые не были просмотрены юзером user_id", т.е. которых нет в таблице.

Ну и всякая мелочь типа "дай мне историю просмотренного контента для юзера", суммарно скажем ещё на 2000 RPS, для ровного счёта.

Сколько реплик и шардов Постгри нужно для реализации такого сервиса, и с какого раза удастся так его написать, чтобы он отвечал не более чем за 50ms и имел среднее время между инцидентами не менее 3 недель, а время восстановления не более часа?  Вопрос со звёздочкой: как будем делать и хранить бэкапы?
Вопрос на зачёт автоматом: как будем масштабировать при росте нагрузки в 2, 3 и 10 раз?
источник

IV

Igor V in ctodailychat
Сергей Аксёнов
Ну окей, вот, например, боевая задачка: сервис "отметки о прочитанном".

Сервис хранит 30 дней истории просмотров юзерами контента строками вида:

user_id int96, content_id string(10), timestamp int32

На базу идёт нагрузка в 10000 RPS на запись блоками от 1 до 10 строк. Итого в таблице постоянно хранится примерно полтора триллиона строк. Понятно, что таблицу надо обрезать не реже чем раз в сутки, при этом не блокируя остальных операций.

Также идёт нагрузка в 3000 RPS запросов вида: "вот список content_id размером не более 1000 элементов, верни мне те из них, которые не были просмотрены юзером user_id", т.е. которых нет в таблице.

Ну и всякая мелочь типа "дай мне историю просмотренного контента для юзера", суммарно скажем ещё на 2000 RPS, для ровного счёта.

Сколько реплик и шардов Постгри нужно для реализации такого сервиса, и с какого раза удастся так его написать, чтобы он отвечал не более чем за 50ms и имел среднее время между инцидентами не менее 3 недель, а время восстановления не более часа?  Вопрос со звёздочкой: как будем делать и хранить бэкапы?
Очень мало входных данных.

1. Почему content_id это string? Там slug?
2. Почему надо обрезать не реже чем раз в сутки?
3.  Вот список content_id из 1000 элементов.. - эти 1000 элементов уникальны для каждого юзера  или стандартные для всех? Эти 1000 записей новые записи или вообще любые?
4.  Какие паттерны у пользователя. Какое отношение просмотренных vs. непросмотренных? Как часто требуется эта операция? Список нужен  пользователю или админу?
источник