Golang
Реализирайте получаването на топ 5 услуги в O(N) с помощта на помощна структура
Актуализациите на документи постъпват в услугата message Document { string Url = 1; // URL на документа, неговият уникален идентификатор uint64 PubDate = 2; // обявеното време за публикуване на документа uint64 FetchTime = 3; // времето на получаване на тази актуализация на документа, може да се счита за идентификатор на версия. Пара (Url, FetchTime) е уникална. string Text = 4; // текстът на документа uint64 FirstFetchTime = 5; // първоначално липсва, трябва да се попълни } Документите могат да пристигат в произволен ред (не в реда, в който са били актуализирани), и може да има дублиращи се съобщения. Необходимо е на изхода да се формират същите съобщения, но с коригирани полета според следните правила (всичко по-долу важи за група документи със същото поле Url): Полето Text и FetchTime трябва да са такива, каквито са в документа с най-голям FetchTime, получен досега. Полето PubDate трябва да е такова, каквото е в съобщението с най-малък FetchTime. Полето FirstFetchTime трябва да е равно на минималната стойност на FetchTime. Тоест, във всеки момент взимаме PubDate и FirstFetchTime от първата версия, получена досега (ако ги сортираме по FetchTime), а Text - от последната. Интерфейсът в кода може да бъде реализиран така: type Processor interface { Process(doc *Document) (*Document, error) } Този код ще работи в услуга, която чете съобщения от опашка (Kafka или подобна), и също така записва резултата в опашката. Ако Process връща Null, нищо не се записва в опашката.
Имаш ли опит с gRPC и GraphQL? Разкажи за тях.
На какви заплатни очаквания се базирате?
Знаеш ли продукта Loop?
Как се отнасяш към дежурствата? Имаш ли такъв опит?
Как точно изглеждаше пътят на оптимистичното блокиране от получаването на съобщението от Kafka до актуализирането в базата данни?
Как получаваш задачите, от кого идват?
Имаш ли опит с оптимизация на заявки в релационни бази данни?
Как използвахте Kafka и RabbitMQ като брокери? Защо два?
Как да паралелизираме обработката на логове с използване на worker pool? Как да получаваме резултати от горутините?
Какви са масивите и слайсовете в Go, как се различават? Как работи append и разширяването на capacity?
Какво е предимството на репликацията? Какви разходи носи тя?
// Имаме метод за получаване на информация за продуктите, този метод се извиква много често // има ли проблеми в този код и как да ги поправим? база данни postgress func (r *ProductRepository) GetProductDetails(ctx context.Context, productIDs []int) []Product { products := make([]Product, 0, len(productIDs)) for _, id := range productIDs { go func(id int) { var p Product query := "SELECT name, price, description FROM products WHERE id = $1" err := r.db.QueryRowContext(ctx, query, id).Scan(&p.Name, &p.Price, &p.Desc) if err != nil { r.logger.Error("error get product", "err", err) return } products = append(products, p) }(id) } return products }
Влияе ли размерът на буфера на канала върху нещо в работната група?
Кога се изчисляват аргументите на отложените функции — в момента на дефиниране или при извикване на функцията?
Как да взаимодействате с търговците, които се намират в външния контур?
Какви средства за синхронизация има при многопоточността в Go?
Какви данни съхраняваха в Redis и как разбираха, че обявите са горещи?
Защо да използваме интерфейси?