Оптимизация производительности — вечная тема в процессе разработки программных проектов. Мы постоянно читали древние книги, искали информацию и беседовали с друзьями-даосами, постоянно совершенствовались и постепенно развивали свои семьдесят два уникальных навыка.
В этой статье собраны 10 основных и распространённых методов оптимизации производительности интерфейса. Каждый из них является классическим решением и достоин ваших лайков, пересылки и сбора. Три последовательных подключения в один клик!
Следите за разработчиками Tencent Cloud и заранее получайте техническую информацию из первых рук👇
Оптимизация производительности — вечная тема в процессе разработки программных проектов.
По мере итерации функций сложность продолжает возрастать, а по мере роста трафика и данных производительность интерфейса может постепенно снижаться. Особенно в сценариях с высоким уровнем параллелизма проблемы с производительностью становятся более вероятными. В это время мы не можем бездействовать. Я начал читать древние книги, искать информацию и брать интервью у друзей-даосов. Я продолжал совершенствоваться и постепенно развил свои семьдесят два уникальных навыка.
В этой статье в основном обобщаются некоторые распространенные методы оптимизации в повседневной разработке, чтобы принести пользу будущему развитию.
2.1 Бизнес-сценарий
В повседневной разработке, особенно при разработке веб-приложений, нам часто необходимо проверять легальность данных. Для достижения этой цели мы обычно выполняем некоторую предварительную проверку параметров. Эти правила проверки могут включать обязательные поля, диапазоны, форматы, регулярные выражения, правила безопасности и пользовательские правила.
Обычно, чтобы упростить бизнес-логику, мы используем сторонние инструменты для выполнения этих универсальных тестов.
2.2 Случай
⓵ Protocol Buffer Validation
Если он основан на протоколе pb, вы можете включить плагин автоматической проверки данных protoc-gen-validate (PGV). Правила настройки следующие:
Сильная проверка title
Длина поля находится в 1 ~ 100 персонажи:
string title = 1 [(validate.rules).string = {min_len: 1, max_len: 100 }];
Обычно перед сохранением базы данных во избежание переполнения ее длину можно предварительно проверить.
Типы, поддерживаемые «Правилами ограничений», включают числовые значения, логические значения, строки, байты, перечисления, сообщения, повторы, карты и т. д.
⓶ Go Struct and Field validation
Для структур, не определенных в pb, также существуют аналогичные компоненты, реализующие автоматическую проверку. Как, например, проверка структуры Go и поля, основное использование заключается в следующем:
// User contains user information
type User struct {
FirstName string `validate:"required"`
LastName string `validate:"required"`
Age uint8 `validate:"gte=0,lte=130"`
Email string `validate:"required,email"`
Gender string `validate:"oneof=male female prefer_not_to"`
FavouriteColor string `validate:"iscolor"` // alias for 'hexcolor|rgb|rgba|hsl|hsla'
Addresses []*Address `validate:"required,dive,required"` // a person can have a home and cottage...
}
Подробная ссылка «Обычно используемые проверки». Если задано valadator
Если он не соответствует вашим потребностям, вы также можете настроить его. validator
。
https://github.com/go-playground/validator?tab=readme-ov-file#baked-in-validations
2.3 Резюме
Как говорится: Если защита не на месте, то тебе сломают ноги, если побежишь по линии.
Защитный дизайн должен учитывать ситуации, когда пользователи могут использовать его неправильно, и избегать неправильного использования за счет дизайна или уменьшать вероятность неправильного использования. Защитный дизайн может сделать программное обеспечение более безопасным и надежным, а также облегчить обнаружение ошибок пользователя.
3.1 Бизнес-сценарий
N+1
Проблема запроса означает, что при запросе данных списка объекта сначала запрашиваются объекты в списке. ID
,Затем цикл для создания отдельногоиз SQL/RPC
Запросить подробные данные объекта. Это приведет к SQL/RPC
Задано слишком много вопросов.
Выполнить несколько раз в цикле RPC
Вызов или операция с базой данных. Когда объем данных невелик, проблема невелика и ее можно запустить. С развитием бизнеса объем данных становится все больше и больше, или возникает необходимость запрашивать id
Поскольку вопросов становится все больше и больше (особенно когда нет ограничений), вполне возможно, что отнимающие время вопросы будут становиться все более и более длинными.
3.2 Случай
⓵ RPC в цикле
При чтении нескольких записей for
Читать отдельные строки отдельно в цикле.
for _, id := range ids {
record := GetDetail(id)
// do something ...
}
Решение: изменить партию (извлечь все результаты идентификации из хранилища одновременно)
records := GetDetails(ids)
// do something ...
3.3 Резюме
Пословица: Куча перьев топит лодку, куча перьев разбивает лодку.
Вышеописанный сценарий является типичным N+1
Проблема не ограничивается чтением, но и письмом. Это может вызвать проблемы с производительностью и увеличить нагрузку на базу данных.
чтобы решить N+1
проблемы, разработчики могут использовать некоторые методы, такие как пакетная загрузка (пакетная загрузка). загрузка), пакетное обновление (массовое Обновления), тем самым уменьшая количество запросов. Оптимизируя запросы к базе данных и стратегии загрузки, разработчики могут избежать N+1
проблемы и повысить эффективность приложений.
Асинхронное мышление: решение долговременных проблем
Асинхронное мышление — это способ решения долговременных проблем. Оно повышает производительность реакции системы и возможности параллельной обработки за счет размещения трудоемких операций в фоновом режиме без блокировки выполнения основного потока или других задач.
4.1 Бизнес-сценарий
существуют при работе с каким-то сложным избизнес-сценарием,для Рассмотрите возможность использования некоторых операцийасинхронный,Это может значительно сократить время интерфейса.
Например, при оптимизации производительности службы отчеты о данных, потоковая передача журналов и т. д. могут обрабатываться асинхронно, чтобы уменьшить задержку интерфейса. Просмотр фотографий, загруженных пользователями, синтез аудио и видео и т. д.
4.2 Случай
⓵ Изменить подпроцесс на асинхронный и сопрограммный.
Если взять в качестве примера дублирование текста (TTS), то два подпроцесса [синтез звука] и [добавление звуковых эффектов] занимают много времени: https://kf.zenvideo.qq.com/help/doc?id=dcccf9045b50dca3
Мы можем инкапсулировать трудоемкую часть в асинхронную задачу и сгенерировать идентификатор задачи, а затем запросить ход обработки и результаты. Часть генерации звука была изменена на асинхронную задачу, поскольку этот подпроцесс является критическим путем дублирования текста (основной процесс, который занимает много времени), можно напрямую изменить на некритические пути, такие как [точки скрытых данных]. обработка сопрограммы:
⓶Асинхронное приложение в базе данных и очереди сообщений
Асинхронная обработка также широко используется в базах данных. Например, команды Redis bgsave и bgrewriteof используются для асинхронного сохранения файлов RDB и AOF соответственно. bgsave вернет успех сразу после выполнения, а основной поток создаст снимок данных. Сохраняем на диск, пока основной поток продолжает выполнять клиентские команды; Redis имеет два способа удаления ключей: del и unlink. Для команды del он удаляется синхронно, а память освобождается напрямую при большом ключе. встречается При удалении операция удаления приведет к возникновению проблемы с задержкой в Redis, а unlink — это асинхронный метод удаления. После выполнения ключ помечается только как недоступный, а память перерабатывается асинхронным потоком без блокировки основного потока.
Синхронизация master-slave MySQL поддерживает асинхронную репликацию, синхронную репликацию и полусинхронную репликацию. Асинхронная репликация означает, что главная база данных возвращает результаты клиенту сразу после выполнения отправленной транзакции и не заботится о том, синхронизировала ли подчиненная база данных данные. Синхронная репликация означает, что главная база данных выполняет отправленную транзакцию, и все подчиненные базы данных выполнили ее; Транзакция вернет результат клиенту; полусинхронная репликация означает, что после завершения выполнения главной базы данных по крайней мере одна подчиненная база данных получила и выполнила транзакцию, прежде чем вернуть ее клиенту. Существует множество методов, главным образом потому, что клиент асинхронной репликации имеет высокую производительность записи, но существует риск потери данных. Его можно использовать в сценариях, где требования к согласованности данных не высоки. Синхронный метод имеет низкую производительность записи и подходит для таких случаев. сценарии, в которых требования к согласованности данных высоки.
Кроме того, производители и потребители Kafka могут отправлять и использовать сообщения асинхронно, но использование асинхронных методов может привести к проблемам с потерей сообщений. Для асинхронной отправки сообщения можно использовать метод с функцией обратного вызова. В случае сбоя отправки функция обратного вызова будет использоваться для обнаружения сбоя, и будет выполнена последующая компенсация сообщения.
4.3 Резюме
Некоторые распространенные методы асинхронного программирования:
Следует отметить, что асинхронность не сокращает общее время ответа, но может увеличить его. Асинхронное программирование имеет свои преимущества и недостатки, и вы можете выбирать в соответствии со своими потребностями:
преимущество:
недостаток:
Подводя итог, можно сказать, что асинхронное программирование имеет множество преимуществ, которые могут повысить производительность и скорость реагирования системы. Однако у него также есть некоторые недостатки, которые необходимо устранить при проектировании и реализации. Разумное применение асинхронного программирования может максимизировать его преимущества и уменьшить влияние его недостатков.
5.1 Бизнес-сценарий
Параллельное мышление — это метод одновременного выполнения нескольких задач или операций для повышения вычислительной мощности и эффективности системы. При параллельном мышлении задача разбивается на несколько подзадач, и эти подзадачи могут выполняться одновременно, полностью используя ресурсы многоядерных процессоров или распределенных систем.
5.2 Случай
⓵ Параллельный синтез субтитров & загрузить cos
Когда редактор Zhiying Express Edition генерирует видео, мы сначала объединяем дорожку субтитров в файл субтитров и добавляем его в cos:
потому что генерировать srt После субтитров также идет загрузка. При последовательном выполнении, когда дорожек субтитров много (например, 10 ) Окончательное время может быть больше. В настоящее время параллельная обработка может значительно повысить эффективность:
В основном используется errgroup
Этот пакет, псевдокод:
package subtitle
import (
"context"
"golang.org/x/sync/errgroup"
)
// TracksAsSrt Конвертировать трек в субтитры
func TracksAsSrt(ctx context.Context, tracks []*Track) (err error) {
eg := errgroup.Group{}
for i := range tracks {
track := tracks[i]
eg.Go(func() error {
// Создайте текущую дорожку субтитров и имя файла субтитров.
filename := GetSrtFilename(track)
// Конвертировать трек в субтитры
srt := ConvertTrackToSrt(track)
// Поместите субтитры в загрузку cos
if _, err = tools.NewSrtCosHelper().Upload(ctx, filename, srt); err != nil {
return err
}
return nil
})
}
return eg.Wait()
}
Сравнение производительности:
Для простоты трудоемкая часть логической обработки моделируется с помощью сна.
file.go
:
// TracksAsSrtSingle Конвертировать трек в субтитры(сериал)
func TracksAsSrtSingle(ctx context.Context, tracks Tracks) (err error) {
for i := range tracks {
i = i
// Моделирование требует много времени
time.Sleep(100 * time.Millisecond)
}
return nil
}
// TracksAsSrtBatch Конвертировать трек в субтитры(параллельный)
func TracksAsSrtBatch(ctx context.Context, tracks Tracks) (err error) {
eg := errgroup.Group{}
for i := range tracks {
i = i
eg.Go(func() error {
// Моделирование требует много времени
time.Sleep(100 * time.Millisecond)
return nil
})
}
return eg.Wait()
}
Результаты стресс-тестов соответствуют ожиданиям: если запустить 10 параллельно, производительность увеличится в 10 раз:
cpu: VirtualApple @ 2.50GHz
BenchmarkTracksAsSrtSingle
BenchmarkTracksAsSrtSingle-10 1 1003969084 ns/op 2410792 B/op 19474 allocs/op
cpu: VirtualApple @ 2.50GHz
BenchmarkTracksAsSrtBatch
BenchmarkTracksAsSrtBatch-10 10 100319896 ns/op 226600 B/op 2026 allocs/op
Внимательные читатели обнаружили, что пакетную обработку можно также реализовать замаскированной параллельной обработкой. Это не обязательно должен быть пакетный интерфейс, предоставляемый нижестоящей службой.
5.3 Резюме
Как говорится: сила в количестве.
В современных операционных системах мы можем легко писать многопроцессные программы. Связь между несколькими процессами — одна из важных вещей, которую следует учитывать. Этот метод связи называется IPC (межпроцессное взаимодействие).
В операционных системах Linux доступно множество методов IPC. С точки зрения механизмов обработки их можно разделить на:
Концепция параллелизма существует уже давно. Основная идея состоит в том, чтобы обеспечить возможность выполнения нескольких задач в течение одного и того же периода времени, чтобы результаты можно было получить быстрее.
Наиболее очевидным преимуществом Go является метод параллельного программирования, основанный на многопоточности. Сопрограммы опасны, и их следует использовать с осторожностью. Чем больше сопрограмм, тем лучше. Когда может появиться большое количество горутин, вы можете рассмотреть возможность использования пула сопрограмм для управления ими. ants — это высокопроизводительный пул горутин с низкими потерями.
6.1 Бизнес-сценарий
Идея обмена пространства на время является распространенной стратегией оптимизации, которая сокращает время выполнения программы за счет добавления дополнительного пространства (памяти, кэша и т. д.). Основной принцип этой идеи заключается в хранении вычислений или данных на более быстрых носителях посредством предварительного вычисления, кэширования или индексирования для сокращения времени доступа и времени вычислений. Это позволяет избежать повторных вычислений или частого доступа к диску, тем самым повышая эффективность выполнения программы.
6.2 Случай
Оптимизация кэша — важная часть оптимизации производительности, которая может значительно улучшить скорость ответа и пропускную способность системы. Общие приложения включают в себя:
6.3 Резюме
Пословица гласит: «Это также правильно и неправильно, это также правильно и неправильно».
Хотя использование кэша может улучшить производительность сервера и удобство работы пользователей, оно также может вызвать другие проблемы, например проблемы согласованности данных. Существуют также такие проблемы, как лавина кэша, проникновение кэша, параллелизм кэша, бездонная яма кэша и удаление кэша.
У каждой медали есть две стороны. Вы можете выбирать и комбинировать вышеуказанные приложения кэширования в соответствии с вашими бизнес-сценариями и архитектурой системы. Важно решить основные противоречия в бизнесе, а не вносить новые проблемы.
7.1 Бизнес-сценарий
Пул соединений — это технология пула буферов, которая создает соединения и управляет ими.
Принцип пула соединений заключается в том, чтобы заранее создать определенное количество объектов соединений и сохранить их в пуле. Когда необходимо использовать соединение, получите доступный объект соединения из пула и верните его в пул после использования, вместо того, чтобы каждый раз создавать и уничтожать объект соединения. Это позволит избежать частого создания и удаления объектов подключения, а также улучшить производительность системы и использование ресурсов.
Общие пулы соединений включают в себя: пул соединений с базой данных (пул соединений go-redis, пул соединений go-orm), пул потоков (Ants пула сопрограмм Go), пул HTTP-соединений и т. д.
пул соединений go-redis:
https://github.com/redis/go-redis/tree/master/internal/pool
пул соединений go-orm:
https://github.com/go-xorm/manual-zh-CN/blob/master/chapter-01/1.engine.md
Перейти к сопрограмме пула муравьев:
https://github.com/panjf2000/ants
Обычно пул соединений содержит следующие ключевые компоненты:
Работа пула соединений выглядит следующим образом:
7.2 Случай
⓵ пул соединений go-redis
Обзор базовой структуры кода пула соединений Реализация пула соединений go-redis разделена на следующие части:
Рисунок: Основной процесс пула соединений go-redis
Принцип работы см. в разделе «Анализ исходного кода пула соединений Go-Redis (пула)».
7.3 Резюме
В общем, пул соединений — это технология, которая эффективно управляет соединениями и повторно использует их. Она может повысить производительность, сэкономить ресурсы, контролировать количество соединений, повысить надежность и упростить программирование приложений. В сценариях с высоким уровнем параллелизма использование пулов соединений является распространенным методом оптимизации.
8.1 Бизнес-сценарий
Мысль о безопасности относится к принципам и концепциям, которые рассматривают безопасность в качестве основного фактора при проектировании, разработке и обслуживании компьютерных систем и сетей. Подчеркивается, что безопасность следует учитывать на протяжении всего жизненного цикла системы, от этапа проектирования до этапов реализации и эксплуатации, и принимать соответствующие меры для защиты системы от угроз злонамеренных атак и утечек данных.
8.2 Случай
⓵ Руководство по безопасному кодированию Go
Внедрение методов безопасного кодирования может повысить безопасность вашего приложения, снизить потенциальные риски безопасности и предоставить пользователям более надежный и безопасный опыт.
Содержимое этого раздела взято из «Руководства по безопасному кодированию» OWASP.
http://www.owasp.org.cn/OWASP-CHINA/go-webapp-scp-cn.pdf
другой:
⓶ Анализ и справочная информация об инцидентах, связанных с отраслевой безопасностью
время | событие | Анализ причин | Наш справочный ответ |
---|---|---|---|
45019 | Samsung подозревают в утечке информации о компании после внедрения ChatGPT | доступ к Самсунгу ChatGPT Позже сотрудник существования слил исходный код и записи встреч во время использования загрузки. В отрасли это вообще подозрительно. ChatGPT Данные разговора могут собираться для итераций обучения и могут быть раскрыты в других разговорах. | Не разглашайте конфиденциальную информацию компании, чтобы не прикасаться к высоковольтным проводам. 1. Не вставляйте рабочие коды в разговор ChatGPT. 2. Не вводите во время разговора конфиденциальную информацию и данные компании, такие как ключи паролей, бизнес-данные, финансовые данные, данные пользователя. персональные данные и неизвестные данные, общедоступные алгоритмы и т. д. |
44930 | Хакеры продали профили 200 миллионов пользователей Twitter | Предполагается, что причина уязвимости 2022 года составлена на основе данных, утекших в результате уязвимости в 2022 году: интерфейс Twitter вернет соответствующий twitterID на основе входящего электронного письма или номера мобильного телефона. | 1. При разработке API следует избегать утечки личных данных пользователей, особенно для интерфейсов, не требующих проверки личности. |
44969 | В сеть утекли данные о 4,5 миллиардах данных об экспресс-доставке | Он может быть склеен из нескольких источников утечек, таких как платформы экспресс-доставки или электронной коммерции. Основные причины утечек в прошлом включают в себя: 1. Уязвимости интерфейса API, приводящие к утечкам 2. Утечки инсайдеров 3. Утечка из платформы облачного хранилища. после внедрения трояна | 1. Интерфейс API не возвращает избыточную информацию; конфиденциальные интерфейсы API проходят строгую аутентификацию. 2. Внутренние разрешения персонала предоставляются по требованию, а платформа управления ограничивает количество экспортируемых элементов. |
45005 | Некоторые пользователи ChatGPT могут просматривать историю чатов других людей. | В используемом пуле клиентских подключений Redis Python есть ошибка. Запросы для некоторых особых сценариев будут неправильно распределяться по обрабатывающим соединениям других людей, и данные других людей будут возвращены соответствующим образом. | 1. Продолжайте использовать последние или безопасные версии стороннего программного обеспечения, своевременно обновляйте и исправляйте версии, содержащие уязвимости. 2. Загрузите сторонние компоненты сначала из внутренних источников программного обеспечения, а затем с официального сайта программного обеспечения. |
44941 | Утечка внутреннего исходного кода российского технологического гиганта Яндекса | Сотрудники злонамеренно скачали и опубликовали исходный код перед уходом с работы (twitter 3 Сотрудник также слил исходный код в этом месяце.событие) | 1. Конфиденциальные данные, такие как ключи и пароли, не записываются в исходном коде. Вместо этого они хранятся в Colorful Stone или KMS. При получении подобных предупреждений о рисках их следует изменять, а не игнорировать. 2. В компании существует мониторинг и аудит. возможности отслеживания вредоносных загрузок и утечек исходного кода, рекомендуется хорошо разрекламировать ситуацию внутри команды, чтобы избежать нарушений правил и законов. |
8.3 Резюме
Пословица: Примите меры предосторожности, прежде чем что-то произойдет.
Мысль о безопасности и защита от уязвимостей являются важными аспектами защиты компьютерных систем и сетевой безопасности. Включив безопасность на ранние этапы проектирования и разработки системы и приняв соответствующие меры защиты от уязвимостей, мы можем снизить риск системных атак, защитить пользовательские данные и конфиденциальность, а также обеспечить нормальную работу системы.
9.1 Бизнес-сценарий
существуют Объем данных немного больше сцены,Передача часто занимает большую часть времени. Алгоритм сжатия находится в играет важную роль в хранении, передаче данных и пользовательском опыте.,Может повысить эффективность, сэкономить ресурсы и улучшить взаимодействие с пользователем.
9.2 Случай
⓵ Применение алгоритма сжатия в протоколе HTTP
Сжатие должно быть повсюду вокруг нас.
Content-Encoding — это поле заголовка в протоколе HTTP, которое указывает, какой тип кодирования и сжатия сервер выполнил для содержимого ответа. Его роль — сообщить клиенту, как декодировать и восстановить сжатый контент, возвращаемый сервером.
Функции Content-Encoding включают в себя:
К общим значениям Content-Encoding относятся: Gzip, Deflate, Br и другие алгоритмы.
Для разработчиков REST API сжатие представления ресурсов — очень важная технология, которая может помочь нам повысить производительность API, уменьшить размер ответа и улучшить взаимодействие с пользователем.
⓶Практика использования алгоритма сжатия при создании и развертывании проектов.
Давайте сначала подведем итоги: сжатие в среднем экономит 90% извремя。
Этот раздел будет основан на теме «Как добиться одновременно скорости и степени сжатия?» «Оптимизация алгоритма сжатия при создании и развертывании» — это пример, кратко объясняющий влияние алгоритма сжатия на практику проекта.
Сравнение нескольких алгоритмов сжатия:
В статье протестированы результаты этих алгоритмов (медиана выбранных результатов из нескольких прогонов), сравнение данных выглядит следующим образом:
Официальное сравнение данных Zstd Benchmark
В этой статье Zstd используется для тестирования пакета выпуска образа, и выводы следующие:
Краткое изложение анализа плюсов и минусов:
В сравнении с существующим тестом Случай порядок затрат времени следующий: Pzstd < ISA-L < Pigz < LZ 4 < Zstd < Brotli < Gzip (Чем выше рейтинг, тем лучше.) Среди них сжатие и распаковка занимают большую часть общего времени, поэтому альтернативной стратегией является Pzstd、ISA-L、Pigz。
Подробный процесс тестирования и сравнение схем можно найти в оригинальной статье: «Как добиться одновременно скорости и степени сжатия?» Оптимизация алгоритма сжатия при создании и развертывании》
9.3 Резюме
Как говорится: нет лучшего, есть только самое подходящее.
Метрики алгоритмов сжатия включают в себя: степень сжатия, скорость сжатия/распаковки, использование процессора/памяти и т. д. Эти метрики часто коррелируют, и разные алгоритмы сжатия могут работать по-разному с разными типами данных и настройками сжатия. При выборе подходящего алгоритма сжатия следует учитывать эти показатели и сопоставлять их с требованиями конкретных приложений.
10.1 Бизнес-сценарий
Очередь сообщений является важным компонентом распределенной системы и играет важную роль в обеспечении высокой производительности, высокой доступности, низкой связанности и других системных архитектур. Его можно использовать в различных бизнес-сценариях, таких как асинхронная связь, снижение пиковых нагрузок, развязка систем и кэширование данных.
Обычно используемые реализации очереди сообщений включают: Kafka, RabbitMQ, RocketMQ, Pulsar, ActiveMQ и т. д.
10.2 Случай
⓵ Разделенная система
Отдел электронной коммерции IT Архитектура как пример。существовать Традицияиз В тесно связанной архитектуре,После того, как клиент разместил заказ,Система заказа После получения заявки,Вызовите систему инвентаризации, чтобы уменьшить запасы. Этот паттерн имеет следующий недостаток:
Решение после цитирования MQ:
После внедрения MQ система заказов и система инвентаризации работают отдельно, устраняя сильную связь. Даже если система инвентаризации не работает при размещении заказа, это не повлияет на нормальное размещение заказа (после восстановления системы инвентаря заказ будет удален из MQ для обеспечения окончательного успеха).
На веб-сайте электронной коммерции, когда регистрируется новый пользователь, информация о пользователе должна быть сохранена в базе данных, а пользователю необходимо отправить дополнительное уведомление о регистрации по электронной почте и регистрационный код SMS.
⓶ Асинхронная связь
На веб-сайте электронной коммерции, когда регистрируется новый пользователь, информация о пользователе должна быть сохранена в базе данных, а пользователю необходимо отправить дополнительное уведомление о регистрации по электронной почте и регистрационный код SMS.
Традицияиз Есть два способа сделать это:Последовательный путь, параллельный путь.
Серийный способ:
После записи регистрационной информации в базу данных сначала отправляется уведомление по электронной почте, а затем SMS-напоминание. После того, как все три вышеуказанные задачи будут выполнены, вернитесь к клиенту.
Рисунок: Последовательная передача
Параллельный путь:
После успешной записи регистрационной информации в базу данных,Отправьте регистрационное письмо одновременно,Отправьте регистрационное СМС. После завершения трех вышеуказанных процессов,Вернулся к клиенту. Разница между последовательным и параллельным режимом заключается в том, что он позволяет сократить время обработки.
Рисунок: Параллельная отправка
Очередь сообщений:
После введения очереди сообщений некритический путь (часть уведомления) может обрабатываться асинхронно, что обеспечивает быстрый ответ:
⓷ Сглаживание пиков и заполнение впадин
В бизнес-сценариях, чувствительных к задержке ввода-вывода, таких как Double Eleven и срочное резервирование мобильных телефонов, когда внешние запросы превышают нагрузку на систему, если в системе нет стратегии защиты от перегрузки, она, вероятно, будет перегружена краткосрочными пиковый трафик.
В ответ на такой пиковый трафик вводятся очереди сообщений для асинхронной обработки немгновенной бизнес-логики и уведомления пользователей (электронные письма, текстовые сообщения и т. д.) после успешной обработки. Этот метод ослабления обработки задержки пикового трафика эквивалентен созданию уровня буферизации для системы.
Изображение: Сглаживание пиков и заполнение впадин
На картинке выше,Желтая часть представляет собой часть, превышающую возможности обработки сообщений. Усредняйте желтую часть сообщения, пока оно не будет свободно обработано.,Это может обеспечить стабильный уровень воды в точке загрузки.,И может обрабатывать как можно больше сообщений. Путем настройки правил управления потоком,Это позволяет добиться эффекта единообразной обработки сообщений.
⓸ Трансляция
Если клиент приобретает товар, подсистема выполнит следующие действия:
При этом никаких зависимостей между этими подсистемами нет. Внедрение MQ может значительно упростить бизнес-логику:
⓹ Задержка очереди
Очередь сообщений может реализовывать некоторые операции задержки, такие как планирование времени, обработка тайм-аута и т. д.
Распределенное планирование времени:
В сценариях, требующих детального планирования, например запуск отправки сообщения каждые 2 минуты. Традиционные решения для планирования времени на основе баз данных имеют низкую производительность и сложную реализацию в распределенных сценариях (особенно при больших объемах данных). Триггеры синхронизации могут быть инкапсулированы на основе очередей сообщений (например, RocketMQ).
Обработка тайм-аута задачи:
Возьмем для примера покупку билета на поезд. 12306 Если оплата не была произведена после оформления заказа, заказ не будет отменен. И да ждет некоторое время (например, 30 мин), система закроет неоплаченные заказы. Вы можете использовать очереди сообщений для реализации проверок задач по тайм-ауту:
Обработка задачи тайм-аута на основе запланированных сообщений имеет следующие преимущества:
другой:
Существует множество сценариев использования отложенных сообщений, таких как повторная попытка обнаружения аномалии, отмена тайм-аута заказа и т. д., например:
10.3 Случай
Ответ: Все проблемы информатики можно решить с помощью другого уровня косвенности.
Все проблемы в информатике можно решить с помощью еще одного среднего слоя.
11.1 Бизнес-сценарий
Опытные дизайнеры знают, что не каждую проблему нужно решать с нуля. Они предпочитают повторно использовать ранее использованные решения. Когда они находят хорошее решение, они используют его снова и снова. Таким образом, вы увидите повторяющиеся шаблоны во многих объектно-ориентированных системах классов и объектов, которые взаимодействуют друг с другом.
Шаблоны проектирования — это типичные решения распространенных проблем при проектировании программного обеспечения. Они подобны готовым чертежам, которые можно адаптировать к вашим потребностям и использовать для решения повторяющихся проблем проектирования в вашем коде.
Каждый шаблон описывает повторяющуюся проблему вокруг нас и суть решения этой проблемы. Таким образом, решение можно использовать снова и снова без дублирования усилий.
По назначению режимы можно разделить на три типа:
11.2 Случай
Каждый шаблон проектирования не изолирован, они неразрывно связаны между собой:
——Из книги GOF «Шаблоны проектирования: основа многоразового объектно-ориентированного программного обеспечения». https://github.com/Seanforfun/Books/blob/master/Java/%E8%AE%BE%E8%AE%A1%E6%A8%A1%E5%BC%8F_%E5%8F%AF%E 5%A4%8D%E7%94%A8%E9%9D%A2%E5%90%91%E5%AF%B9%E8%B1%A1%E8%BD%AF%E4%BB%B6%E7% 9A%84%E5%9F%BA%E7%A1%80.pdf
Из-за ограничений по объему в этой статье не будет перечислена конкретная реализация каждого режима. Для реализации версии Go обратитесь к: «golang-design-pattern».
https://github.com/senghoo/golang-design-pattern
⓵ Творческий режим
⓶ Структурный образец
⓷ Поведенческая модель
11.3 Резюме
Как упоминалось ранее: «Чтобы решить любую проблему, не обязательно начинать с нуля».
Шаблон проектирования — это методология решения проблем при проектировании программного обеспечения. Он может улучшить удобство сопровождения, возможность повторного использования и масштабируемость кода, а также помогает повысить надежность и стабильность программной системы.
-End-
Автор оригинала|Лян Юаньчжэн