Я создаю сайт, используя React и Express GraphQL, с базой данных MariaDB.Однако я столкнулся с проблемой частых запросов / подписок на API GraphQL.
После загрузки соответствующей страницы в React я вызываю это:
componentDidMount() {
this.setState({
waitingTimer: setInterval(this.queryWaiting.bind(this), 1000)
});
}
где queryWaiting
- это функция, которая выполняет запрос fetch
на мой сервер GraphQL по номеру localhost:3000/graphql
.Этот URL-адрес является прокси-сервером, определенным в моем файле setupProxy.js
, который передает URL-адрес с localhost:4000/graphql
, поэтому мне не нужно использовать CORS.
Стоит отметить, что я также clearInterval
this waitingTimer
in componentWillUnmount
.
В моем файле сервера GraphQL, который я просто запускаю с node
, я настроил свой сервер так:
var app = express();
app.use("/graphql", graphqlHTTP({
schema: schema,
rootValue: root,
graphiql: true,
}));
app.listen(4000);
Где schema
является допустимой схемой, а root
является моим корневым распознавателем.
Запрос API, который я повторяю, вызываю, называется getWaitingCount
и действует так:
getWaitingCount: () => {
return new Promise((resolve, reject) => {
var currentTime = Date.now() / 1000;
if (cachedWaitingTime + cachedWaitingInterval > currentTime) {
return cachedWaiting;
}
connection.query("SELECT COUNT(*) FROM profiles WHERE isWaiting=1;", function (error, results, fields) {
if (error)
reject(error);
else {
// Update cache values
cachedWaiting = results[0]["COUNT(*)"];
cachedWaitingTime = Date.now() / 1000;
resolve(cachedWaiting);
}
});
});
}
Я реализовал некоторое кэширование, чтобы уменьшить нагрузку на сервер.Переменные кэширования определены в другом месте.
Проблема, с которой я сталкиваюсь, заключается в том, что через 2-10 секунд запросы POST для этого конкретного запроса из моего приложения React перестают обрабатываться, и мне приходится перезагружать страницу дляих начать получать снова.Как ни странно, другие запросы проходят нормально.
Я пробовал различные решения, такие как переключение на использование метода прокси, который я использую в настоящее время, и я также рассмотрел возможность встроенногоМеханизм DDOS в коде Express, но я не могу найти никаких доказательств этого.
Любая помощь в этом вопросе очень ценится.