i in {1..1000000}
do
curl localhost:8080/health?uptime=isodate
done
В обработчике Vapor выполняется такой код:
res.headers.replaceOrAdd(name: "X-Stats-Uptime", value: statsService.getUptime(type))
В statsService.getUptime() выполняется такой код:
let date = Date(timeIntervalSinceReferenceDate: bootTime)
return "since \(DateFormatter.iso8601ShortUTCZ.string(from: date))"
т.е. задействуется глобально определенный DateFormatter.
Вот он:
static let iso8601ShortUTCZ: DateFormatter = {
let formatter = DateFormatter()
formatter.dateFormat = "yyyy-MM-dd'T'HH:mm:ss'Z"
formatter.calendar = Calendar(identifier: .iso8601)
formatter.timeZone = TimeZone(secondsFromGMT: 0)
formatter.locale = Locale(identifier: "en_US_POSIX")
return formatter
}()
По выдаче htop видно, что CPU 100%, причем оба процесса Vapor загружены примерно равномерно. Т.е. используются оба ядра. Никаких проблем, крашей, в логе чисто. Единственное — перестал срабатывать VaporCron.
у них там в примере не крешилось, а строка портилась (становилась другой длины от ожидаемой)
У них — да. Но я их код тоже крутил, выше писал — ничего.
Я бы сказал что лучше перестраховаться. У нас 10 микросервисов и падал только 1 причем падал когда с фронта приходило сразу 2 запроса с разницей в миллисекунды. Фронт конечно решил эту проблему со своей стороны но мы перестраховались и сделали постоянную инициализацию форматера
https://t.me/server_side_swift/81170
О, соломки подстелить — это наше ффсё. По я пока не знаю, какую именно именно можно подстелить, особо не не влезая в код. Поразбираюсь с локами сейчас.
диспатч в мейн или выделить для него свою очередь
Только что проверил на дедике (Ryzen 3600x), завершается успешно
Ну какой мейн, там евентлупы
А ты уверен что у тебя цикл тут не дожидается результата прежде чем отправить следующий запрос?
Там же с 4 сессий одновременно
Конечно дожидается. Но их 4 штуки. А ядер только 2.
Попробуй увеличить объем данных которые кодируются. Возможно у тебя слишком быстро они обрабатываются и не попадают на гонку)
Обсуждают сегодня