Backend возможно Flashcards

1
Q

Provide few examples of HTTP methods?

A

content-length, content-type, cookie, authorization, user-agent

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
2
Q

What are HTTP status codes?
Расскажи подробнее (выучить самые популярные коды)

A

HTTP status codes…
From 100 to 199 are reserved for informational status codes.
From 200 to 299 there are success codes
From 300 to 399 there are redirect codes
From 400 to 499 are frontend error codes
From 500 to 599 there are backend error codes

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
3
Q

What is proxy?
What is reverse-proxy?
What is difference between them?

A

Proxy is a server that stands between client and destination server and act on behalf of client.
The purpose of proxy-server can be different.
It can be used to hide real client IP address and another information, or to act like VPN, or just to do some caching in order to improve performance.

The reverse-proxy is a server that stands between server and clients and act on behalf of destination server. It takes requests from clients and then re-send them to real server or servers.
It can be used for multiple purposes. First of all, in order to protect real servers from direct access and improve safety, but it also can be used as traffic balancer and requests router, or, again, be used to cache some data in order to improve performance.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
4
Q

What actions have you personally taken on recent projects to increase maintainability of your code?

A

Okay… At first, I am trying to keep same code style, because this makes code reading much easier. This was implemented as on my current workplace, same in my pet projects. This touches indentation, naming, etcetera.

Second, is splitting code into small functional blocks, each of what contains only certain information, and I am trying to avoid code mixing, following first SOLID principle.

All in all, I am trying always remember about SOLID and KISS principles and follow them.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
5
Q

What is DNS and what it needed for?

A

DNS or Domain Name System, is a system used in Internet to transform human-readable domain names, like youtube.com, into IP addresses, which are used by computers for identification and interaction.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
6
Q

What is TDD (Test Driven Development)?

A

Test Driven Development is a development, where when you want to add new functionality into your application, you write tests, covering this functionality, first, and only then write code for this functionality itself.

This approach makes your code more covered with tests, so it makes it more reliable. Also, when you are writing tests, you have time to think about, for example, what your function should return in what cases, and what are edge cases, etcetera, so this is easier to write man functionality after writing tests.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
7
Q

Explain the difference between mutable and immutable objects. What is an example of an immutable object in JavaScript? What are the pros and cons of immutability? How can you achieve immutability in your own code?

A

Mutable objects can be changed, while immutable objects is not possible to change.

About pros and cons. From one side, immutability makes states easier to manage, because you are always sure, that if you somewhere used any value, it won’t be accidentally changed somewhere else, and program is more predictable.
From another side, in case of immutability, if you want to somehow modify string, for example, then you create another new object, containing all changes, and this takes additional memory and time.

About how to achieve immutability. For simple things like number or string, we can just use const word when declaring variables with these values. But for more complex things like arrays and objects you need to use special libraries, which provide this immutability functional, or write your own code which will allow you to interact with arrays and objects like if they were immutable too.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
8
Q

What is Domain Driven Design?

A

Domain Driven Design is a design, where we rely on business processes to define our project structure. The idea is to separate business processes into domains, which are minimally connected to other domains, and then based on these domains needs we create separate project modules, each responsible only for one domain. All data and algorithms needed for each separate domain are placed inside this certain domain module.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
9
Q

What is the difference between a process and a thread within an operating system?

A

Process is an instance of executable program. This instance includes program code itself, memory, required for code execution, and environment variables. Address space of each process is isolated, so that means that memory that this process uses can’t be directly accessed by other process.
But this isolation and process context itself is quite heavy and requires a lot of resources when creating new one or switching between processes.

Thread is execution unit, that exists inside process scope. Process can have multiple threads that work on its execution. Threads share same resources and address space inside process, and make it possible for process to do some work in parallel, using multiple threads.

To sum up, processes are isolated from each other, but threads share same memory space inside process scope.
Process creation is more complicated and takes more resources that creation of new thread.
Communication between processes is complicated and slow, but threads can communicate quickly.
Errors in one process won’t affect other processes, but error in one thread can crash whole process it belongs to.
Processes are good for things, that should be isolated from each other and be more reliable, while threads are good for splitting process work into multiple parts in order to do it quickly, for example in video redactors.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
10
Q

Как выглядит структура типичного проекта, с которым ты работал?

A

Ну, сама папка проекта, в ней отдельные папки для api, где лежат прото файлы сервиса, папка с автоматически генерируемым платформой кодом, где всякие базовые штуки, вроде взаимодействия с корпоративным чатом, кроной, кафкой, и всем таким.
Ещё есть отдельная папка для хранения middleware и миграций базы данных.
В отдельной папке также тесты, и ещё код, сгенерированный по прото файлам из самого проекта, и из проектов, которые в специальном файле указаны как связанные с этим проектом. Ну то есть, чтобы можно было туда слать запросы.
Ну и ещё в отдельной папке сам main файл, и внутренний код самого проекта

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
11
Q

Как выглядит запрос к RPC ручке?

A

Ну, обычно это выглядит так, что у тебя есть Golang код, сгенерированный специальной тулзой на базе .proto контракта, и ты вызываешь функции из этого сгенерированного кода.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
12
Q

Как выглядит процесс создания новой RPC ручки?

A

Ну, сначала описывается сама структура метода в .proto файле сервиса, если надо добавляются новые структуры для описания аргументов или возвращаемого значения.

Потом на базе этого обновляется сгенерированный код.

Потом в функции инициализации там где ты регистрируешь свой сервис который ты ранее определил в .proto файле, ты подставляешь структуру, которая имплементирует методы сервиса.

Ну и в этом методе уже как-то обрабатываешь сам запрос.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
13
Q

Каким образом делали запрос по RPC к другим сервисам?

A

Ну, у других сервисов есть свои .proto файлы.
В твоём проекте в специальном yaml файле - конфиге для платформы, на которой всё разрабатывается, перечисляются сервисы, с которыми твой сервис взаимодействует.

С помощью тулзы генеришь код, он помещается в специальную папку в проекте, и потом просто используешь функции из этой сгенереной апишки.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
14
Q

Каким образом фронт делал запросы к RPC ручкам?

A

А фронт не делал запросы к RPC ручкам, фронт ходил на REST ручки, а потом уже с них запросы перенаправлялись куда надо.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
15
Q

Что такое Protocol Buffers, и как они связаны с gRPC?

A

Protocol Buffers это бинарный формат сериализации данных, который используется в gRPC. То есть, там мы не текст и не JSON какой-нибудь передаём, а в .proto файле определяем контракт, и потом на базе этого .proto файла происходит сериализация и десереализация.

How well did you know this?
1
Not at all
2
3
4
5
Perfectly
16
Q

Какие есть основные типы RPC в gRPC?

A

Ну, есть One Time Connection, то есть аналог простого запроса в REST. Мы однократно передали какую-то информацию с клиента на сервер, однократно получили ответ.

Ещё есть Server Stream, Client Stream и Bidirectional Stream подключения. В первых двух мы с одной из сторон несколько раз передаём какие-то данные, а в последнем с обоих.

17
Q

Расскажите о максимальном объёме данных, который передавался через gRPC.

A

Вроде бы по дефолту максимальный размер пакета это 4 мегабайта, если нужно больше, то нужно либо редактировать конфиги, либо использовать стриминг.

18
Q

Как оптимизировать gRPC на высоконагруженных системах?

A

Что можно сделать…

Ну, например, настроить тайм-ауты. Чтобы операции долго не висели, если второй сервис не отвечает.

Ещё, если нам надо передавать много данных между клиентом и сервером, то использовать не отдельные запросы, а по возможности стримы.

Ещё, можно стучаться не напрямую к какому-то конкретному серверу, а на балансировщик, и от него уже перенаправлять запросы на кластер серверов.

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

Ещё, можно использовать асинхронные механизмы обработки запросов, например через брокеры сообщений, а не стучаться к сервису напрямую. Особенно, если запрос занимает много времени.

19
Q

Как организовать обратную совместимость в gRPC?

A

Ну, во-первых, не надо изменять номера полей. Если поле больше не используется, то его номер нельзя переиспользовать.
Не нужно удалять методы сервисов.

20
Q

Использовали ли вы gRPC-Gateway? Как вы настраивали его?

A

У нас на проекте использовался для генерации API, к которому ходит фронт, но это уже было, и я это не настраивал.

21
Q

Объясните, как работают interceptor-ы в gRPC. Использовали ли вы их?

A

Интерцепторы это middleware

22
Q

Как вы дебажили ошибки, связанные с gRPC?

A

Ну, основных инструмента три, это логи запросов, это сваггер, который можно использовать для отправки запросов и проверки, всё ли идёт как надо, и это Jaeger, чтобы глянуть путь запроса и попробовать понять, когда и почему что-то пошло не так.

23
Q

Что вы делали в случае появления Deadline Exceeded или Unavailable?

A
  1. Проверяем, что это ошибка именно запроса, а не где-то в коде
  2. Если ошибка запроса, то изучаем подробности, статус, message и детали.
  3. Используем их для того, чтобы вернуть ошибку с максимальным количеством информации и человекочитаемым описанием.

Если это не ошибка скажем, неправильных аргументов, или ещё чего-то, а просто запрос exceeded или unavailable, и твоя ручка не синхронная и не имеет прям жёстких временных рамок, то можно несколько раз повторить запрос.

24
Q

Что бы вы выбрали: gRPC или REST для нового проекта? Почему?

A

Зависит от многих факторов.
Если бы мне нужно было бы просто создать одиночный сервис, то я бы использовал REST, потому что так меньше мороки.

А вот если бы у меня было много микросервисов, да ещё нужно было бы часто между ними ходить, да ещё и нагрузка была бы большая, то там уже gRPC, потому что он в такой ситуации оказывается более быстрым и удобным, да и избавляет от потенциальной проблемы рассогласованности контрактов.

25
Q

Что такое gRPC?

A

gRPC это фреймворк для создания API в формате RPC, который позволяет описывать контракты для передачи данных между клиентом и сервером.
gRPC использует .proto файлы для описания структуры сервисов, а также содержащихся в них методов и типов данных, которые могут передаваться как аргументы или возвращаться из этих функций.

При описании контрактов в proto файле мы можем кроме самой базовой информации по типу аргументов и возвращаемых значений также описать дополнительные данные с использованием option. Например, у нас на работе там описывалась информация, необходимая для генерации REST API на базе того или иного RPC метода, по типу метода, используемого для запроса, или url, по которому надо для доступа к этому методу постучаться, или для логирования и сбора метрик, или какая-то дополнительная информация, которая использовалась для swagger-а.

Также, при определении структуры данных сообщений в gRPC для каждого поля указывается его уникальный id, который не должен совпадать с любыми другими в рамках того же сообщения.
Этот id используется при сериализации и десериализации данных.
Если в какой-то момент мы убираем какое-то поле, или хотим поменять его тип, или делаем что-то такое, то мы должны использовать другой id, а старый id отметить как зарезирвированный, чтобы его никто больше не использовал.

26
Q

Что такое RPC?

A

RPC это Remote Procedure Call.
Это такой подход в работе с API, при котором наши бэковые сервисы, или клиент и бэк работают с ручками API, как будто это просто локальные функции, передавая туда аргументы, и получая возвращаемое значение.

Отличие от REST в этом случае в том, что RPC поднимает уровень абстракции, и позволяет работать с функцией будто бы она является локальной, не беспокоясь о деталях реализации и внутренностях HTTP запросов и ответов.
REST при этом явно отделяет клиент от сервера, и предлагает работать с API с точки зрения ресурса. То есть, у нас по определённому адресу находится удалённый ресурс, и мы с использованием разных методов HTTP можем к нему стучаться, сами вручную формируем запрос, и потом разбираем ответ.

Также, RPC работает быстрее чем REST, потому что при передаче данных использует бинарный формат, который потом напрямую кастуется в нужный тип, а в REST обычно JSON или другие текстовые данные перекидываются, которые ещё парсить нужно.

Однако, с другой стороны, для работы с ручками на RPC необходим доступ к Proto файлам для генерации соответствующего кода и правильной десереализации бинарных данных, полученных от сервиса, а REST, в то же время, передаёт данные в понятных форматах, с которыми уже понятно как работать.

Поэтому, RPC более предпочтителен во внутренних системах, где нужно по-быстрому передавать много данных, а REST подходит для какого-нибудь публичного API, который могут использовать сторонние разработчики.

27
Q

Насколько я знаю, для gRPC методов создаются REST ручки, и фронт работает именно с ними, да и в Swagger работа идёт именно в виде REST. А как слать запросы именно в gRPC? Или всегда в этом случае запрос отсылается на REST точку, а сервис сам себе внутри заменеджит?

A

Фронт и Swagger работают только с REST апишкой

28
Q

Почему взаимодействие между процессами более медленное, чем между тредами в рамках процесса?

A

Потому что у тредов в рамках одного процесса единое адресное пространство, и они могут обмениваться данными через него, что быстро и просто.

А процессы работают в разных адресных пространствах, и для передачи данных между ними нужны более сложные механизмы, например очередь сообщений, да и передаваемые данные нужно сериализовывать. (потому что ссылки на области памяти в одной программе не будут работать в другой)

29
Q

Как тред работает с памятью?

A

Тред имеет свой стек фиксированного размера
При его переполнении происходит ошибка stack overflow
Стек изолирован - другие треды не имеют к нему доступа

Треды имеют доступ к куче. Куча общая для всех тредов в рамках одного процесса