@Azperin
Дилетант

Консистентность глобальной переменной при одновременных запросах в сокеты?

Упрощенный пример кода, уточнение вопроса под ним.
var SUPERGLOBALVARIABLE = {
	user228: {
		wallet: {
			RUB: 0,
			EUR: 0,
			USD: 0
		}
	},
	user303: {
		wallet: {
			RUB: 100,
			EUR: 0,
			USD: 0
		}
	}
};
io.on('connect,'function(socket) {
	//после магии с авторизацией выяснили что ид юзера 303, соответственно у коннекта будет 100 рублей на счету SUPERGLOBALVARIABLE['user' + '303'].wallet.RUB;
	//два события: один на обмен евро, другой на обмен долларов. Обменивает он всегда по 1 единице валюты и всегда по заданному глобально курсу.
	socket
	.on('exchangeEUR', () => {
		if (SUPERGLOBALVARIABLE['user' + '303'].wallet.RUB > 70)
			SUPERGLOBALVARIABLE['user' + '303'].wallet.RUB -= 70;
			SUPERGLOBALVARIABLE['user' + '303'].wallet.EUR += 1;
		};
	})
	.on('exchangeUSD', () => {
		if (SUPERGLOBALVARIABLE['user' + '303'].wallet.RUB > 65)
			SUPERGLOBALVARIABLE['user' + '303'].wallet.RUB -= 65;
			SUPERGLOBALVARIABLE['user' + '303'].wallet.USD += 1;
		};
	});
});

Дак вот вопрос, может ли хотябы теоретически случиться такая ситуация, что пользователь каким-то неведанным способом сможет на 100р успешно выполнить оба запроса ? Вследствии ддоса или еще чего-нибудь подобного.
Я надеюсь понятно, что выше предоставленна упрощенная версия логики и кода (на практике там больше вычислений и загрузки проца), но каких-либо асинхронных операций в самих событиях нет, только сами блокирующие вычисления. Просто сами сокеты это асинхранная штука(насколько я знаю), поэтому и такой вопрос.
Все данные, при запуске сервера, он загружает из базы и держит в оперативке, тоесть запросов в базу, в блоке события, тоже нет.
  • Вопрос задан
  • 112 просмотров
Решения вопроса 1
@vshvydky
Нода исполняет код в 1 потоке, разработчику гарантировано что в 1 момент времени выполняется только 1 код
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
Event loop
Ну и в целом читать что такое event loop в реализации nodeJS
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы