Вопрос
Я бэкенд разработчик. Изучаю распределенные системы и принципы их проектирования. Задался вопросом: а как, собственно, происходят сбои в системах, когда, допустим, на них льется много трафика? Ведь именно из-за этого мы и проектируем системы так, чтобы они были высокодоступные? Я бы не хотел просто заучить CAP, BASE, PACEL и другие теоремы/принципы/свойства. Я бы хотел ПОНЯТЬ СУТЬ. И после некоторых размышлений пришел к такому вопросу.
Также у меня есть собственные дилетантские выводы. Опишу их ниже. Если это хотя бы похоже на правду, прошу, дайте знать.
Моя теория
Все базируется на формуле I = V * t, где I - объем информации (бит), V - скорость передачи информации по сети (бит/с), t - время в секундах.
Также я узнал про буфер в сетевых картах. Все запросы в любом случае идут через какой-то сетевой интерфейс, а значит 100% попадают в их буфер, т.к. должны где-то какое-то время храниться.
Ну и также я предположил, что процесс (программа) может считать данные из сокета (т.е. взять из сетевого буфера) и загрузить их в ОЗУ для дальнейшей обработки. Не факт, что программа сразу начнет их обработку.
В итоге, у меня получилась такая система.
Опишу все по порядку:
- W - скорость записи, входящий трафик, бит/сек.
- X - кол-во запросов в секунду. Здесь не уверен, как правильно считать W. Написал как понял сам.
- v(r) - средний объем запроса, биты. Грубо говоря, если у нас 1000rps (запросов в секунду) на какой-то эндпоинт, и в среднем 1 запрос = 2Кб, тогда нагрузка в бит/сек W = 1000 * (2 * 1024 * 8). Знаю, формулы дилетантские, поэтому и обращаюсь за помощью к сообществу.
- R - скорость считывания данных из буфера сетевой карты (или из ОЗУ, если данные перенесены туда). По сути, равна сумме производительности всех процессов, занимающихся обработкой данных. В простейшем случае есть 1 процесс (n = 1), обрабатывающий данные, бит/сек.
- P(i) - производительность процесса, бит/сек.
- V(Wt) - объем записанных данных за t сек, биты
- V(Rt) - объем считанных (обработанных) данных за t сек, биты
- V(max) - объем сетевого буфера/ОЗУ
Графическое представление для наглядности
Выводы из всего этого
- Если V(w) > V(max), тогда либо забьется буфер и некоторые сетевые пакеты будут отброшены, либо, подозреваю, забьется ОЗУ и сервис упадет.
- Если R < W (т.е скорость потребления и обработки информации меньше, чем входящий трафик), то рано или поздно случится V(w) > V(max) (см. пункт 1).
Напоминаю, что я полнейший дилетант, который очень поверхностно знает теорию компьютерных сетей. Я скромный бэкенд-разработчик, который хочет ПОНЯТЬ СУТЬ. Почему мы заботимся о производительности, о доступности наших систем. Увидеть воочию пользу load balancer'ов, паттернов по типу CQRS и прочих подходов.
Заранее благодарю.