В начале года мы немного растерялись, поэтому последовали тренду и сделали несколько легких развлекательных игр.
В то время, для реального боя, я подумал о необходимости технической реализации в реальном времени, поэтому я реализовал сервер веб-сокетов.Я не ожидал, что эти маленькие программы потом выйдут из строя, но наш сервер веб-сокетов везде развивался. Техническая реализация этого описана ниже.
Это должно быть немного сложно, чтобы взглянуть на теорию, не так ли, нам просто нужно перейти непосредственно к коду. Мы сейчас предполагаем, что такая логика оплаты пользователя есть, при написании события оплаты пользователя мы заранее не знаем, какую логику нужно добавить в будущем, поэтому сначала транслируем это поведение. Вот псевдокод:
req := httplib.Post("https://ws.app.12zan.net/eventcast/user/5905e89db43fec42e3055df05ff72afe")
text, er := zanjson.Encode(order)
if er != nil {
log.Println(ev)
return
}
req.Param("data", string(text))
resp,_ = req.Response()
Что ж, теперь всякий раз, когда пользователь платит, система пользователя будет транслировать сообщение на канал /eventcast/user/5905e89db43fec42e3055df05ff72afe. Но, к сожалению, на данный момент нет клиентов, подписанных на такие сообщения, и все сообщения отбрасываются.
Однажды наш мудрый босс Shenwu решил добавить уведомление: всякий раз, когда новый пользователь платит, он будет отправлять электронное письмо соотечественникам компании, чтобы уведомить нас о том, что мы приобрели новых платящих пользователей, чтобы все могли быть счастливы. все прыгают от радости, особенно когда первый пробный клиент заплатил за это. В настоящее время, если мы изменим систему онлайн-платежей, это все еще немного рискованно.После модификации мы должны пройти процесс тестирования, иначе, если возникнет проблема, не повлияет ли это на состояние компании. ? Неважно, разве мы не транслировали платежное событие раньше, мы используем его сейчас. Просто напишите такой кусок js и запустите его онлайн.
const webSocket = require('ws');
let ws = new webSocket("wss://ws.app.12zan.net/eventcast/user/5905e89db43fec42e3055df05ff72afe");
ws.on('open', function open() {
console.log("connected");
});
ws.on('message', function incoming(data) {
let user = JSON.parse(data);
Mail.send("一个叫"+user.name+"的好心人支付了"+user.amount+"元,让主赞美他!");
});
Что ж, теперь, когда кто-то платит, мы получаем электронное письмо по всей компании, как раз вовремя для хороших новостей. Давайте немного отпразднуем.
В ближайшие несколько дней мы хотим улучшить опыт. После того, как пользователь успешно заплатит, будет отправлено текстовое сообщение, чтобы проинформировать пользователя о его сроке действия и номер нашей круглосуточной службы поддержки клиентов; нужно только развернуть эту часть код и запустите его, прежде чем вам не нужно трогать какой-либо код:
const webSocket = require('ws');
let ws = new webSocket("wss://ws.app.12zan.net/eventcast/user/5905e89db43fec42e3055df05ff72afe");
ws.on('open', function open() {
console.log("connected");
});
ws.on('message', function incoming(data) {
let user = JSON.parse(data);
let expiresAt = (zan.Date.now().add("+365 day").format("YYYY-mm-dd"));
SMS.send(user.Mobile,"尊敬的"+user.name+",您成功购买了十二赞旗舰版,有效期至"+expiresAt+",请登陆:https://www.12zan.cn 查看,如有任何疑问,欢迎致电4006681102");
});
Отправка уведомлений по электронной почте и отправка текстовых уведомлений основаны на платежных действиях пользователя, но коды для отправки электронных писем и текстовых сообщений полностью изолированы, и они совершенно не знают о существовании друг друга.
Разве это не здорово? Тогда давайте разбираться с логикой.
Концепция и основная логика
Может быть, у нас нет времени смотреть на определение веб-сокета, но мы можем просто понять, что веб-сокет — это расширение и обновление протокола HTTP, когда соединение инициируется, часть HTTP действительна, но после успешного соединения , соединение между сервером и клиентом Непрерывно обе стороны могут передавать данные в обоих направлениях, и сервер может активно передавать данные клиенту.
Давайте посмотрим на процесс инициирования соединения Websocket (из Википедии):
Клиент инициирует соединение с сервером:
GET / HTTP/1.1
Upgrade: websocket
Connection: Upgrade
Host: example.com
Origin: http://example.com
Sec-WebSocket-Key: sN9cRrP/n9NdMgdcy2VJFQ==
Sec-WebSocket-Version: 13
Возврат с сервера:
HTTP/1.1 101 Switching Protocols
Upgrade: websocket
Connection: Upgrade
Sec-WebSocket-Accept: fFBooB7FAkLlXgRSz0BT3v4hq5s=
Sec-WebSocket-Location: ws://example.com/
Общие поля в протоколе HTTP, такие как файлы cookie, хост и т. д., по-прежнему действительны.
Но специфично для нашего приложения сервер вебсокета Twelve Likes достиг двух небольших целей [как жаль, я не заработал двести миллионов]:
1. То, что мы реализуем, — это система вещания.Система вещания означает одно место для отправки данных и несколько приемников для приема данных. Необходимо поддерживать очень большое количество клиентов, подключающихся к данным одновременно, чтобы получать данные в режиме реального времени. Наша окончательная реализация на стороне сервера, реализация с полной памятью, не использует Redis или базы данных, подобные MySQL, только для поддержки нескольких клиентов.
2. Мы надеемся использовать самый простой и распространенный копирайтинг, и он очень эффективен и поддерживает большое количество клиентов для одновременного подключения.Мы думаем, что протокол http проще, поэтому при отправке мы используем протокол http для отправить данные. Кроме того, нет никакого дизайна безопасности.Если данные очень важны, пожалуйста, зашифруйте их самостоятельно и отправьте.
Конечно, у нас также есть некоторые сожаления:
1. Разрешить потерю данных. Есть приобретения и потери, и мы допускаем пропорциональную потерю информации. Когда происходит потеря данных, основная логика не затрагивается. Так же, как в примере только что, не имеет значения, что событие отправки электронного письма, чтобы уведомить нас о новом платеже, не срабатывает, мы только узнали, что новый пользователь заплатил днем, а затем это не так. поздно открывать шампанское :(.
2. Терпеть нарушение синхронизации. Как в примере только что, когда новый пользователь делает платеж, не так важно, сообщить ли всем нашим коллегам, что есть новый платеж, или сначала отправить текстовое сообщение пользователю.
Что ж, вернемся к нашей системе, дадим небольшое резюме.
Мы определяем, что запись каждого веб-сокета является URL-адресом; удаляем части протокола и HOST, а оставшиеся части PATH представляют разные каналы. Например, когда веб-сокет инициирован, подключитесь к ws://ws.app.12zan.net/channel/hello, тогда адрес канала будет /channel/hello; все клиенты веб-сокета, подключенные к ws.app.12zan.net/ канал/привет, они получат точно такое же сообщение, которое мы называем подпиской.
При этом, чтобы упростить процесс инициации данных, мы также определяем в сервере websocket: когда http-клиент запрашивает адрес по POST, мы перехватываем PATH-часть URL-адреса, получаем имя канала и получаем POST data В поле данных, как данные для трансляции, транслируйте их на соответствующий канал.
Заявки в двенадцать лайков:
Эта система вещания во всей технической базе Двенадцати Зан впоследствии применялась очень широко.
Например, наша система развертывания zeus реализует клиент на веб-странице.Когда приложение перезапускается, закрывается или запускается на сервере, всплывает уведомление о сообщении. Ее может увидеть любой, кто откроет веб-страницу системы. Например, мой коллега Сяо Ван и я оба на сайте zeus.Я создал новый узел поисковой системы.Когда запуск будет завершен, Сяо Ван и я получим уведомление о запуске новой поисковой системы на третьем сервер.узел. Я работаю, и я очень обеспокоен этим, поэтому я могу быть уверен, что продолжу свою работу в это время. Сяо Ван собирался развернуть новую систему на машине № 3. Получив уведомление, он почувствовал, что эта машина может быть очень занята, поэтому развернул свой новый экземпляр на машине № 4.
Другой пример: наш сервер журналов отвечает за сбор журналов на всех серверах. Но что, если он зависнет? Итак, мы запустили таймер на этом лог-сервере, который каждые 5 секунд транслировал сообщение пульса на канал, сообщая миру, что мы живы. Затем запустите другой процесс, чтобы прослушать трансляцию этого канала.Если пакет сердцебиения не получен в течение 30 секунд подряд, это доказывает, что сервер журнала не работает, и будет отправлено текстовое сообщение о тревоге, чтобы проинформировать учащихся о необходимости проверить эту службу. .
Другой пример нашего приложения на сервисе логов смотрите здесь:Введение в систему регистрации двенадцати лайков
Перепечатано с официального сайта Twelve Zan [исходная ссылка]