10 обязательных советов по оптимизации производительности интерфейса для архитекторов, все классические!
10 обязательных советов по оптимизации производительности интерфейса для архитекторов, все классические!

Оптимизация производительности — вечная тема в процессе разработки программных проектов. Мы постоянно читали древние книги, искали информацию и беседовали с друзьями-даосами, постоянно совершенствовались и постепенно развивали свои семьдесят два уникальных навыка.

В этой статье собраны 10 основных и распространённых методов оптимизации производительности интерфейса. Каждый из них является классическим решением и достоин ваших лайков, пересылки и сбора. Три последовательных подключения в один клик!

Следите за разработчиками Tencent Cloud и заранее получайте техническую информацию из первых рук👇

01. Напишите впереди

Оптимизация производительности — вечная тема в процессе разработки программных проектов.

По мере итерации функций сложность продолжает возрастать, а по мере роста трафика и данных производительность интерфейса может постепенно снижаться. Особенно в сценариях с высоким уровнем параллелизма проблемы с производительностью становятся более вероятными. В это время мы не можем бездействовать. Я начал читать древние книги, искать информацию и брать интервью у друзей-даосов. Я продолжал совершенствоваться и постепенно развил свои семьдесят два уникальных навыка.

В этой статье в основном обобщаются некоторые распространенные методы оптимизации в повседневной разработке, чтобы принести пользу будущему развитию.

02. Оборонительная конструкция: проверка

2.1 Бизнес-сценарий

В повседневной разработке, особенно при разработке веб-приложений, нам часто необходимо проверять легальность данных. Для достижения этой цели мы обычно выполняем некоторую предварительную проверку параметров. Эти правила проверки могут включать обязательные поля, диапазоны, форматы, регулярные выражения, правила безопасности и пользовательские правила.

Обычно, чтобы упростить бизнес-логику, мы используем сторонние инструменты для выполнения этих универсальных тестов.

2.2 Случай

⓵ Protocol Buffer Validation

Если он основан на протоколе pb, вы можете включить плагин автоматической проверки данных protoc-gen-validate (PGV). Правила настройки следующие:

Сильная проверка title Длина поля находится в 1 ~ 100 персонажи:

Язык кода:javascript
копировать
string title = 1 [(validate.rules).string = {min_len: 1, max_len: 100 }];

Обычно перед сохранением базы данных во избежание переполнения ее длину можно предварительно проверить.

Типы, поддерживаемые «Правилами ограничений», включают числовые значения, логические значения, строки, байты, перечисления, сообщения, повторы, карты и т. д.

⓶ Go Struct and Field validation

Для структур, не определенных в pb, также существуют аналогичные компоненты, реализующие автоматическую проверку. Как, например, проверка структуры Go и поля, основное использование заключается в следующем:

Язык кода:javascript
копировать
// 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 Резюме

Как говорится: Если защита не на месте, то тебе сломают ноги, если побежишь по линии.

Защитный дизайн должен учитывать ситуации, когда пользователи могут использовать его неправильно, и избегать неправильного использования за счет дизайна или уменьшать вероятность неправильного использования. Защитный дизайн может сделать программное обеспечение более безопасным и надежным, а также облегчить обнаружение ошибок пользователя.

03. Пакетное мышление: решение проблемы N+1

3.1 Бизнес-сценарий

N+1 Проблема запроса означает, что при запросе данных списка объекта сначала запрашиваются объекты в списке. ID,Затем цикл для создания отдельногоиз SQL/RPC Запросить подробные данные объекта. Это приведет к SQL/RPC Задано слишком много вопросов.

Выполнить несколько раз в цикле RPC Вызов или операция с базой данных. Когда объем данных невелик, проблема невелика и ее можно запустить. С развитием бизнеса объем данных становится все больше и больше, или возникает необходимость запрашивать id Поскольку вопросов становится все больше и больше (особенно когда нет ограничений), вполне возможно, что отнимающие время вопросы будут становиться все более и более длинными.

3.2 Случай

⓵ RPC в цикле

При чтении нескольких записей for Читать отдельные строки отдельно в цикле.

Язык кода:javascript
копировать
for _, id := range ids {
    record := GetDetail(id)
    // do something ...
}

Решение: изменить партию (извлечь все результаты идентификации из хранилища одновременно)

Язык кода:javascript
копировать
records := GetDetails(ids)
// do something ...

3.3 Резюме

Пословица: Куча перьев топит лодку, куча перьев разбивает лодку.

Вышеописанный сценарий является типичным N+1 Проблема не ограничивается чтением, но и письмом. Это может вызвать проблемы с производительностью и увеличить нагрузку на базу данных.

чтобы решить N+1 проблемы, разработчики могут использовать некоторые методы, такие как пакетная загрузка (пакетная загрузка). загрузка), пакетное обновление (массовое Обновления), тем самым уменьшая количество запросов. Оптимизируя запросы к базе данных и стратегии загрузки, разработчики могут избежать N+1 проблемы и повысить эффективность приложений.

04

Асинхронное мышление: решение долговременных проблем

Асинхронное мышление — это способ решения долговременных проблем. Оно повышает производительность реакции системы и возможности параллельной обработки за счет размещения трудоемких операций в фоновом режиме без блокировки выполнения основного потока или других задач.

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 Резюме

Некоторые распространенные методы асинхронного программирования:

Следует отметить, что асинхронность не сокращает общее время ответа, но может увеличить его. Асинхронное программирование имеет свои преимущества и недостатки, и вы можете выбирать в соответствии со своими потребностями:

преимущество:

  1. улучшатьсистемаиз Отзывчивость:асинхронный Программирование позволяет избежать длительных трудоемких операций, блокирующих основнойнитьили другие задачиизосуществлять,Тем самым улучшая скорость ответа и удобство использования. Размещая трудоемкие операции в фоновом режиме,Основной поток может продолжать выполнять другие задачи.,Не нужно ждать завершения операции.
  2. Улучшите возможности параллельной обработки: асинхронное программирование может выполняться одновременно с другими задачами.,Полностью использовать ресурсы системы,Улучшить систему возможностей параллельной обработки. Выполняя несколько задач одновременно,Может сократить общее время обработки,Улучшить системуиз пропускной способности.
  3. Экономьте потребление ресурсов: асинхронное программирование позволяет сократить ненужное потребление ресурсов. Размещая трудоемкие операции в фоновом режиме,Это позволяет избежать слишком большого использования ресурсов ЦП и памяти.,Улучшение использования ресурсов.
  4. Улучшите читаемость и удобство сопровождения кода: асинхронное программирование может сделать код более кратким и простым для понимания. используя асинхронный/ожидание или Promise Дождитесь режима программирования,асинхронный код может быть написан синхронно,Улучшите читаемость и удобство сопровождения кода.
  5. Поддержка параллельных вычислений и распределенной обработки: асинхронное программирование может поддерживать параллельные вычисления и распределенную обработку. Разбивая задачу на подзадачи,и используйте большенить、распределенные вычисления или GPU Такие технологии, как параллельные вычисления, могут обеспечить эффективные параллельные вычисления и обработку данных.
  6. Улучшите масштабируемость системы: асинхронное программирование может улучшить масштабируемость системы. Параллельная обработка путем распределения задач по нескольким процессорным блокам или узлам.,Могут быть достигнуты распределенная параллельная обработка и балансировка нагрузки.,Улучшите масштабируемость и производительность.

недостаток:

  1. Повышенная сложность: асинхронное программирование включает в себя такие понятия и технологии, как функции обратного вызова, Promise, асинхронное/ожидание и т. д.,новичкам может быть сложнее изучить и понять из.
  2. Сложная обработка ошибок. Обработка ошибок в программировании может быть более сложной, и вам придется обрабатывать ошибки и ошибки Promise в функциях обратного вызова. код кода.
  3. Может вызвать состояние гонки: существование в параллельной среде,асинхронное программирование может вызвать состояние гонки (Race Condition) и непротиворечивость данныхизвопрос,Для решения этой проблемы необходимы дополнительные механизмы управления параллелизмом и синхронизации данных.
  4. Трудности при отладке: Из-за неопределенности порядка и времени выполнения задач при асинхронном программировании.,Отладка асинхронного кода может оказаться сложнее,Требуются соответствующие инструменты и методы отладки.
  5. Может привести к аду обратного вызова: существуют сложные изасинхронные операции, использование функций обратного вызова может привести к аду обратного вызова (Callback Черт возьми), что затрудняет понимание и поддержку кода. Это можно сделать с помощью Для решения этой проблемы используются такие методы, как Promise и асинхронный/ожидание.

Подводя итог, можно сказать, что асинхронное программирование имеет множество преимуществ, которые могут повысить производительность и скорость реагирования системы. Однако у него также есть некоторые недостатки, которые необходимо устранить при проектировании и реализации. Разумное применение асинхронного программирования может максимизировать его преимущества и уменьшить влияние его недостатков.

05. Параллельное мышление: повышение эффективности обработки

5.1 Бизнес-сценарий

Параллельное мышление — это метод одновременного выполнения нескольких задач или операций для повышения вычислительной мощности и эффективности системы. При параллельном мышлении задача разбивается на несколько подзадач, и эти подзадачи могут выполняться одновременно, полностью используя ресурсы многоядерных процессоров или распределенных систем.

5.2 Случай

⓵ Параллельный синтез субтитров & загрузить cos

Когда редактор Zhiying Express Edition генерирует видео, мы сначала объединяем дорожку субтитров в файл субтитров и добавляем его в cos:

потому что генерировать srt После субтитров также идет загрузка. При последовательном выполнении, когда дорожек субтитров много (например, 10 ) Окончательное время может быть больше. В настоящее время параллельная обработка может значительно повысить эффективность:

В основном используется errgroup Этот пакет, псевдокод:

Язык кода:javascript
копировать
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

Язык кода:javascript
копировать
// 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 раз:

Язык кода:javascript
копировать
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 — это высокопроизводительный пул горутин с низкими потерями.

06. Идея обмена пространства на время: сокращение затрат времени

6.1 Бизнес-сценарий

Идея обмена пространства на время является распространенной стратегией оптимизации, которая сокращает время выполнения программы за счет добавления дополнительного пространства (памяти, кэша и т. д.). Основной принцип этой идеи заключается в хранении вычислений или данных на более быстрых носителях посредством предварительного вычисления, кэширования или индексирования для сокращения времени доступа и времени вычислений. Это позволяет избежать повторных вычислений или частого доступа к диску, тем самым повышая эффективность выполнения программы.

6.2 Случай

Оптимизация кэша — важная часть оптимизации производительности, которая может значительно улучшить скорость ответа и пропускную способность системы. Общие приложения включают в себя:

  • Распределенный кеш:
    • Redis(https://github.com/redis/redis)
    • Memcached(https://github.com/memcached/memcached)
  • компонент локального кэша:
    • bigcache(https://github.com/allegro/bigcache)

6.3 Резюме

Пословица гласит: «Это также правильно и неправильно, это также правильно и неправильно».

Хотя использование кэша может улучшить производительность сервера и удобство работы пользователей, оно также может вызвать другие проблемы, например проблемы согласованности данных. Существуют также такие проблемы, как лавина кэша, проникновение кэша, параллелизм кэша, бездонная яма кэша и удаление кэша.

У каждой медали есть две стороны. Вы можете выбирать и комбинировать вышеуказанные приложения кэширования в соответствии с вашими бизнес-сценариями и архитектурой системы. Важно решить основные противоречия в бизнесе, а не вносить новые проблемы.

07. Пул соединений: повторное использование ресурсов

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

Обычно пул соединений содержит следующие ключевые компоненты:

  1. пул Менеджер соединений: отвечает за создание, инициализацию и управление пулом. соединений。
  2. Пул объектов соединения: сохраняет объект соединения из контейнера и предоставляет методы для получения и возврата объектов соединения из контейнера.
  3. соединять Объект: представляет связь между ресурсом (например, базой данных).、нить、HTTP Сервер) изоединять.

Работа пула соединений выглядит следующим образом:

  1. Инициализировать пул соединения: создать определенное количество изоединять объектов и сохранить их в пуле существующихсоединять объектов.
  2. Получить соединение: если вам нужно использовать соединение, получите доступный объект-изоединять из пула объектов соединения.
  3. Использовать соединение: использовать полученный объект изоединять для выполнения соответствующих операций.,нравитьсяосуществлять Запрос к базе данных、осуществлятьнить Задача、отправлять HTTP Запрос и т. д.
  4. Возврат соединения: после использования,Вернуть соединяемый объект в пул соединяемых объектов,Сделайте его доступным для других запросов.
  5. Уничтожить соединение: когда пул соединений больше не нужен.,Может разрушать соединяющиеся объекты,Освободите ресурсы.

7.2 Случай

⓵ пул соединений go-redis

Обзор базовой структуры кода пула соединений Реализация пула соединений go-redis разделена на следующие части:

  1. пул соединенийинициализация、управлятьсоединять;
  2. Установить и закрыть соединение;
  3. Получить и вернуть обратно соединение, ядро ​​реализует Get и Put;
  4. Мониторинг статистики && соединять Организация присмотра за детьми;

Рисунок: Основной процесс пула соединений go-redis

Принцип работы см. в разделе «Анализ исходного кода пула соединений Go-Redis (пула)».

7.3 Резюме

В общем, пул соединений — это технология, которая эффективно управляет соединениями и повторно использует их. Она может повысить производительность, сэкономить ресурсы, контролировать количество соединений, повысить надежность и упростить программирование приложений. В сценариях с высоким уровнем параллелизма использование пулов соединений является распространенным методом оптимизации.

08. Бизнес-сценарий

8.1 Бизнес-сценарий

Мысль о безопасности относится к принципам и концепциям, которые рассматривают безопасность в качестве основного фактора при проектировании, разработке и обслуживании компьютерных систем и сетей. Подчеркивается, что безопасность следует учитывать на протяжении всего жизненного цикла системы, от этапа проектирования до этапов реализации и эксплуатации, и принимать соответствующие меры для защиты системы от угроз злонамеренных атак и утечек данных.

8.2 Случай

⓵ Руководство по безопасному кодированию Go

Внедрение методов безопасного кодирования может повысить безопасность вашего приложения, снизить потенциальные риски безопасности и предоставить пользователям более надежный и безопасный опыт.

Содержимое этого раздела взято из «Руководства по безопасному кодированию» OWASP.

http://www.owasp.org.cn/OWASP-CHINA/go-webapp-scp-cn.pdf

другой:

  • «Краткое справочное руководство по методам безопасного кодирования OWASP» http://www.owasp.org.cn/OWASP-CHINA/owasp-project/download/OWASP_SCP_Quick_Reference_Guide-Chinese.pdf
  • «Десять наиболее критических угроз безопасности API» http://www.owasp.org.cn/OWASP-CHINA/owasp-project/OWASPAPITop102019.pdf
  • Руководство по защите от CSRF https://cheatsheetseries.owasp.org/cheatsheets/Cross-Site_Request_Forgery_Prevention_Cheat_Sheet.html
  • RE2 https://github.com/google/re2
  • 《2021 OWASP TOP 10》 http://www.owasp.org.cn/OWASP-CHINA/owasp-project/OWASP-TOP10-2021%E4%B8%AD%E6%96%87%E7%89%88V1.0%E5%8F%91%E5%B8%83.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 Резюме

Пословица: Примите меры предосторожности, прежде чем что-то произойдет.

Мысль о безопасности и защита от уязвимостей являются важными аспектами защиты компьютерных систем и сетевой безопасности. Включив безопасность на ранние этапы проектирования и разработки системы и приняв соответствующие меры защиты от уязвимостей, мы можем снизить риск системных атак, защитить пользовательские данные и конфиденциальность, а также обеспечить нормальную работу системы.

09. Бизнес-сценарий

9.1 Бизнес-сценарий

существуют Объем данных немного больше сцены,Передача часто занимает большую часть времени. Алгоритм сжатия находится в играет важную роль в хранении, передаче данных и пользовательском опыте.,Может повысить эффективность, сэкономить ресурсы и улучшить взаимодействие с пользователем.

9.2 Случай

⓵ Применение алгоритма сжатия в протоколе HTTP

Сжатие должно быть повсюду вокруг нас.

Content-Encoding — это поле заголовка в протоколе HTTP, которое указывает, какой тип кодирования и сжатия сервер выполнил для содержимого ответа. Его роль — сообщить клиенту, как декодировать и восстановить сжатый контент, возвращаемый сервером.

Функции Content-Encoding включают в себя:

  1. Сжатая передача: используя поле заголовка Content-Encoding, сервер может сжимать содержимое ответа и уменьшать размер данных, тем самым уменьшая объем передаваемых данных и потребление полосы пропускания сети. Это может повысить эффективность сетевой передачи и ускорить передачу данных.
  2. Экономия пропускной способности. Сжимая содержимое ответа, Content-Encoding может уменьшить размер данных, тем самым экономя пропускную способность сети. Для веб-сайтов и приложений с интенсивным сетевым трафиком это может снизить нагрузку на сервер и сеть, а также повысить общую производительность и скорость ответа.
  3. Распаковка клиента: когда клиент получает ответ с полем заголовка Content-Encoding, он может распаковать содержимое в соответствии с указанным алгоритмом сжатия. Это позволяет клиентам восстанавливать исходный контент перед сжатием для правильной обработки и отображения.

К общим значениям Content-Encoding относятся: Gzip, Deflate, Br и другие алгоритмы.

Для разработчиков REST API сжатие представления ресурсов — очень важная технология, которая может помочь нам повысить производительность API, уменьшить размер ответа и улучшить взаимодействие с пользователем.

⓶Практика использования алгоритма сжатия при создании и развертывании проектов.

Давайте сначала подведем итоги: сжатие в среднем экономит 90% извремя。

Этот раздел будет основан на теме «Как добиться одновременно скорости и степени сжатия?» «Оптимизация алгоритма сжатия при создании и развертывании» — это пример, кратко объясняющий влияние алгоритма сжатия на практику проекта.

  • В статье используются данные пакета построения изображений;
  • В сравнительном тесте решений для теста сжатия был выбран строительный пакет размером около 1 ГБ, который может покрыть 99% сценариев, также видно, что алгоритмы сжатия значительно улучшились;

Сравнение нескольких алгоритмов сжатия:

В статье протестированы результаты этих алгоритмов (медиана выбранных результатов из нескольких прогонов), сравнение данных выглядит следующим образом:

Официальное сравнение данных Zstd Benchmark

В этой статье Zstd используется для тестирования пакета выпуска образа, и выводы следующие:

  • Мы используем Zstd Параметры по умолчанию были протестированы, время сжатия 8.471 s только оригинал 11,266%, улучшение 88.733%。
  • Разархивироватьвремя 3.211 только оригинал 29,83%, увеличение примерно 70.169%。
  • При этом степень сжатия также была увеличена с 2,548 до 2,621.

Краткое изложение анализа плюсов и минусов:

В сравнении с существующим тестом Случай порядок затрат времени следующий: Pzstd < ISA-L < Pigz < LZ 4 < Zstd < Brotli < Gzip (Чем выше рейтинг, тем лучше.) Среди них сжатие и распаковка занимают большую часть общего времени, поэтому альтернативной стратегией является Pzstd、ISA-L、Pigz。

Подробный процесс тестирования и сравнение схем можно найти в оригинальной статье: «Как добиться одновременно скорости и степени сжатия?» Оптимизация алгоритма сжатия при создании и развертывании》

9.3 Резюме

Как говорится: нет лучшего, есть только самое подходящее.

Метрики алгоритмов сжатия включают в себя: степень сжатия, скорость сжатия/распаковки, использование процессора/памяти и т. д. Эти метрики часто коррелируют, и разные алгоритмы сжатия могут работать по-разному с разными типами данных и настройками сжатия. При выборе подходящего алгоритма сжатия следует учитывать эти показатели и сопоставлять их с требованиями конкретных приложений.

10. Развязка: очередь сообщений

10.1 Бизнес-сценарий

Очередь сообщений является важным компонентом распределенной системы и играет важную роль в обеспечении высокой производительности, высокой доступности, низкой связанности и других системных архитектур. Его можно использовать в различных бизнес-сценариях, таких как асинхронная связь, снижение пиковых нагрузок, развязка систем и кэширование данных.

Обычно используемые реализации очереди сообщений включают: Kafka, RabbitMQ, RocketMQ, Pulsar, ActiveMQ и т. д.

10.2 Случай

⓵ Разделенная система

Отдел электронной коммерции IT Архитектура как пример。существовать Традицияиз В тесно связанной архитектуре,После того, как клиент разместил заказ,Система заказа После получения заявки,Вызовите систему инвентаризации, чтобы уменьшить запасы. Этот паттерн имеет следующий недостаток:

  • Система заказов тесно связана с системой инвентаризации, возможно, внутри сервиса. RPC вызов;
  • При внезапном движении,Загрузка системы инвентаризации (запрос, модификация).

Решение после цитирования MQ:

После внедрения MQ система заказов и система инвентаризации работают отдельно, устраняя сильную связь. Даже если система инвентаризации не работает при размещении заказа, это не повлияет на нормальное размещение заказа (после восстановления системы инвентаря заказ будет удален из MQ для обеспечения окончательного успеха).

На веб-сайте электронной коммерции, когда регистрируется новый пользователь, информация о пользователе должна быть сохранена в базе данных, а пользователю необходимо отправить дополнительное уведомление о регистрации по электронной почте и регистрационный код SMS.

⓶ Асинхронная связь

На веб-сайте электронной коммерции, когда регистрируется новый пользователь, информация о пользователе должна быть сохранена в базе данных, а пользователю необходимо отправить дополнительное уведомление о регистрации по электронной почте и регистрационный код SMS.

Традицияиз Есть два способа сделать это:Последовательный путь, параллельный путь.

Серийный способ:

После записи регистрационной информации в базу данных сначала отправляется уведомление по электронной почте, а затем SMS-напоминание. После того, как все три вышеуказанные задачи будут выполнены, вернитесь к клиенту.

Рисунок: Последовательная передача

Параллельный путь:

После успешной записи регистрационной информации в базу данных,Отправьте регистрационное письмо одновременно,Отправьте регистрационное СМС. После завершения трех вышеуказанных процессов,Вернулся к клиенту. Разница между последовательным и параллельным режимом заключается в том, что он позволяет сократить время обработки.

Рисунок: Параллельная отправка

Очередь сообщений:

После введения очереди сообщений некритический путь (часть уведомления) может обрабатываться асинхронно, что обеспечивает быстрый ответ:

  • После успешной записи регистрационной информации в базу данных сообщения для отправки регистрационных писем и регистрационных SMS-сообщений записываются в очередь сообщений и возвращаются клиенту;
  • Затем сервер подписывается на очередь сообщений (гарантированный окончательный успех) и отправляет регистрационные электронные письма и регистрационные SMS-сообщения соответственно.

⓷ Сглаживание пиков и заполнение впадин

В бизнес-сценариях, чувствительных к задержке ввода-вывода, таких как Double Eleven и срочное резервирование мобильных телефонов, когда внешние запросы превышают нагрузку на систему, если в системе нет стратегии защиты от перегрузки, она, вероятно, будет перегружена краткосрочными пиковый трафик.

В ответ на такой пиковый трафик вводятся очереди сообщений для асинхронной обработки немгновенной бизнес-логики и уведомления пользователей (электронные письма, текстовые сообщения и т. д.) после успешной обработки. Этот метод ослабления обработки задержки пикового трафика эквивалентен созданию уровня буферизации для системы.

Изображение: Сглаживание пиков и заполнение впадин

На картинке выше,Желтая часть представляет собой часть, превышающую возможности обработки сообщений. Усредняйте желтую часть сообщения, пока оно не будет свободно обработано.,Это может обеспечить стабильный уровень воды в точке загрузки.,И может обрабатывать как можно больше сообщений. Путем настройки правил управления потоком,Это позволяет добиться эффекта единообразной обработки сообщений.

⓸ Трансляция

Если клиент приобретает товар, подсистема выполнит следующие действия:

  • Балловая система накапливает очки роста;
  • Система подарков Отправляйте подарки клиентам;
  • Рекомендовать систему для продвижения периферийных устройств продукта;

При этом никаких зависимостей между этими подсистемами нет. Внедрение MQ может значительно упростить бизнес-логику:

  • Уменьшите сложность транзакций,Создаются только сообщения о транзакциях;
  • Удалить зависимости между системой,Произвести данные один раз,Может использоваться разными подсистемами одновременно,Многократное повторное использование;
  • Обработка может быть отложена в зависимости от особенностей бизнеса.

⓹ Задержка очереди

Очередь сообщений может реализовывать некоторые операции задержки, такие как планирование времени, обработка тайм-аута и т. д.

Распределенное планирование времени:

В сценариях, требующих детального планирования, например запуск отправки сообщения каждые 2 минуты. Традиционные решения для планирования времени на основе баз данных имеют низкую производительность и сложную реализацию в распределенных сценариях (особенно при больших объемах данных). Триггеры синхронизации могут быть инкапсулированы на основе очередей сообщений (например, RocketMQ).

Обработка тайм-аута задачи:

Возьмем для примера покупку билета на поезд. 12306 Если оплата не была произведена после оформления заказа, заказ не будет отменен. И да ждет некоторое время (например, 30 мин), система закроет неоплаченные заказы. Вы можете использовать очереди сообщений для реализации проверок задач по тайм-ауту:

Обработка задачи тайм-аута на основе запланированных сообщений имеет следующие преимущества:

  • Высокая точность и низкий порог разработки: в зависимости от метода уведомления о сообщении нет запланированного интервала шагов. Легко достигается запуск с произвольной точностью.,Нет необходимости в дедупликации бизнеса.
  • Высокая производительность и масштабируемость: традиционные методы сканирования баз данных более сложны.,Необходимо часто вызывать сканирование интерфейса,Легко создать узкие места в производительности. Очередь сообщений имеет высокую степень параллелизма и возможности горизонтального расширения.

другой:

Существует множество сценариев использования отложенных сообщений, таких как повторная попытка обнаружения аномалии, отмена тайм-аута заказа и т. д., например:

  • Если запрос на обслуживание является ненормальным, его необходимо поместить в отдельную очередь и повторить попытку через 5 минут;
  • Пользователь покупает товар, но еще не оплатил. Пользователю необходимо регулярно напоминать об оплате, а заказ будет закрыт по истечении таймаута;
  • Чтобы назначить собеседование или встречу, отправьте уведомление с напоминанием еще раз за полчаса до начала собеседования или встречи.

10.3 Случай

Ответ: Все проблемы информатики можно решить с помощью другого уровня косвенности.

Все проблемы в информатике можно решить с помощью еще одного среднего слоя.

11. Повторное использование: шаблоны проектирования

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

⓵ Творческий режим

  • Простой шаблон фабрики (Простая фабрика) https://github.com/senghoo/golang-design-pattern/tree/master/00_simple_factory
  • Шаблон фабричного метода https://github.com/senghoo/golang-design-pattern/tree/master/04_factory_method
  • Паттерн Абстрактная Фабрика (Абстрактная Фабрика) https://github.com/senghoo/golang-design-pattern/tree/master/05_abstract_factory
  • Режим строителя (Строитель) https://github.com/senghoo/golang-design-pattern/tree/master/06_builder
  • Прототип https://github.com/senghoo/golang-design-pattern/tree/master/07_prototype
  • Шаблон синглтона https://github.com/senghoo/golang-design-pattern/tree/master/03_singleton

⓶ Структурный образец

  • Фасад https://github.com/senghoo/golang-design-pattern/tree/master/01_facade
  • Режим адаптера https://github.com/senghoo/golang-design-pattern/tree/master/02_adapter
  • Режим прокси (Прокси) https://github.com/senghoo/golang-design-pattern/tree/master/09_proxy
  • Композитный режим https://github.com/senghoo/golang-design-pattern/tree/master/13_composite
  • Режим наилегчайшего веса https://github.com/senghoo/golang-design-pattern/tree/master/18_flyweight
  • Декоратор https://github.com/senghoo/golang-design-pattern/tree/master/20_decorator
  • Режим моста (Мост) https://github.com/senghoo/golang-design-pattern/tree/master/22_bridge

⓷ Поведенческая модель

  • Шаблон посредника https://github.com/senghoo/golang-design-pattern/tree/master/08_mediator
  • Паттерн «Наблюдатель» (Наблюдатель) https://github.com/senghoo/golang-design-pattern/tree/master/10_observer
  • Командный режим (Командный) https://github.com/senghoo/golang-design-pattern/tree/master/11_command
  • Шаблон итератора (Итератор) https://github.com/senghoo/golang-design-pattern/tree/master/12_iterator
  • Шаблон «Метод шаблона» (Шаблонный метод) https://github.com/senghoo/golang-design-pattern/tree/master/14_template_method
  • Стратегия https://github.com/senghoo/golang-design-pattern/tree/master/15_strategy
  • Режим состояния https://github.com/senghoo/golang-design-pattern/tree/master/16_state
  • Режим сувенира https://github.com/senghoo/golang-design-pattern/tree/master/17_memento
  • Режим переводчика (Интерпретатор) https://github.com/senghoo/golang-design-pattern/tree/master/19_interpreter
  • Модель цепочки ответственности https://github.com/senghoo/golang-design-pattern/tree/master/21_chain_of_responsibility
  • Режим посетителя https://github.com/senghoo/golang-design-pattern/tree/master/23_visitor

11.3 Резюме

Как упоминалось ранее: «Чтобы решить любую проблему, не обязательно начинать с нуля».

Шаблон проектирования — это методология решения проблем при проектировании программного обеспечения. Он может улучшить удобство сопровождения, возможность повторного использования и масштабируемость кода, а также помогает повысить надежность и стабильность программной системы.

-End-

Автор оригинала|Лян Юаньчжэн

boy illustration
Углубленный анализ переполнения памяти CUDA: OutOfMemoryError: CUDA не хватает памяти. Попыталась выделить 3,21 Ги Б (GPU 0; всего 8,00 Ги Б).
boy illustration
[Решено] ошибка установки conda. Среда решения: не удалось выполнить первоначальное зависание. Повторная попытка с помощью файла (графическое руководство).
boy illustration
Прочитайте нейросетевую модель Трансформера в одной статье
boy illustration
.ART Теплые зимние предложения уже открыты
boy illustration
Сравнительная таблица описания кодов ошибок Amap
boy illustration
Уведомление о последних правилах Points Mall в декабре 2022 года.
boy illustration
Даже новички могут быстро приступить к работе с легким сервером приложений.
boy illustration
Взгляд на RSAC 2024|Защита конфиденциальности в эпоху больших моделей
boy illustration
Вы используете ИИ каждый день и до сих пор не знаете, как ИИ дает обратную связь? Одна статья для понимания реализации в коде Python общих функций потерь генеративных моделей + анализ принципов расчета.
boy illustration
Используйте (внутренний) почтовый ящик для образовательных учреждений, чтобы использовать Microsoft Family Bucket (1T дискового пространства на одном диске и версию Office 365 для образовательных учреждений)
boy illustration
Руководство по началу работы с оперативным проектом (7) Практическое сочетание оперативного письма — оперативного письма на основе интеллектуальной системы вопросов и ответов службы поддержки клиентов
boy illustration
[docker] Версия сервера «Чтение 3» — создайте свою собственную программу чтения веб-текста
boy illustration
Обзор Cloud-init и этапы создания в рамках PVE
boy illustration
Корпоративные пользователи используют пакет регистрационных ресурсов для регистрации ICP для веб-сайта и активации оплаты WeChat H5 (с кодом платежного узла версии API V3)
boy illustration
Подробное объяснение таких показателей производительности с высоким уровнем параллелизма, как QPS, TPS, RT и пропускная способность.
boy illustration
Удачи в конкурсе Python Essay Challenge, станьте первым, кто испытает новую функцию сообщества [Запускать блоки кода онлайн] и выиграйте множество изысканных подарков!
boy illustration
[Техническая посадка травы] Кровавая рвота и отделка позволяют вам необычным образом ощипывать гусиные перья! Не распространяйте информацию! ! !
boy illustration
[Официальное ограниченное по времени мероприятие] Сейчас ноябрь, напишите и получите приз
boy illustration
Прочтите это в одной статье: Учебник для няни по созданию сервера Huanshou Parlu на базе CVM-сервера.
boy illustration
Cloud Native | Что такое CRD (настраиваемые определения ресурсов) в K8s?
boy illustration
Как использовать Cloudflare CDN для настройки узла (CF самостоятельно выбирает IP) Гонконг, Китай/Азия узел/сводка и рекомендации внутреннего высокоскоростного IP-сегмента
boy illustration
Дополнительные правила вознаграждения амбассадоров акции в марте 2023 г.
boy illustration
Можно ли открыть частный сервер Phantom Beast Palu одним щелчком мыши? Супер простой урок для начинающих! (Прилагается метод обновления сервера)
boy illustration
[Играйте с Phantom Beast Palu] Обновите игровой сервер Phantom Beast Pallu одним щелчком мыши
boy illustration
Maotouhu делится: последний доступный внутри страны адрес склада исходного образа Docker 2024 года (обновлено 1 декабря)
boy illustration
Кодирование Base64 в MultipartFile
boy illustration
5 точек расширения SpringBoot, супер практично!
boy illustration
Глубокое понимание сопоставления индексов Elasticsearch.
boy illustration
15 рекомендуемых платформ разработки с нулевым кодом корпоративного уровня. Всегда найдется та, которая вам понравится.
boy illustration
Аннотация EasyExcel позволяет экспортировать с сохранением двух десятичных знаков.