1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/sogou-workflow

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
README_cn.md 19 КБ
Копировать Редактировать Web IDE Исходные данные Просмотреть построчно История
Отправлено 01.03.2025 10:20 552780a

Русская версия

Sogou C++ Workflow

Лицензия Язык Платформа Статус сборки

C++ серверный движок компании Sogou, программная парадигма. Поддерживает большинство backend C++ онлайн-сервисов компании Sogou, включая все сервисы поиска, облачную клавиатуру, онлайн рекламу и многое другое, ежедневно обрабатывая миллиарды запросов. Это легкий и элегантно спроектированный корпоративный движок, который может удовлетворять большинству требований backend и embedded разработки.

Вы можете использовать его для:

  • Быстрого создания HTTP-сервера:
#include <stdio.h>
#include "workflow/WFHttpServer.h"

int main()
{
    WFHttpServer server([](WFHttpTask *task) {
        task->get_resp()->append_output_body("<html>Hello World!</html>");
    });

    if (server.start(8888) == 0) {  // запустить сервер на порту 8888
        getchar(); // нажмите "Enter", чтобы завершить.
        server.stop();
    }

    return 0;
}
  • В качестве универсального асинхронного клиента. Поддерживает протоколы http, redis, mysql и kafka.
    • Легко создать высокоэффективного спайдера.
    • Протокол mysql также поддерживает базы данных MariaDB и TiDB.
  • Реализация клиентского/серверного соединения с пользовательским протоколом, создание собственной системы RPC.
    • Проект srpc основан на этом движке и открыт как отдельный проект. Поддерживает протоколы srpc, brpc, trpc и thrift.
  • Создание асинхронной задачи потока, поддерживающей общие последовательные и параллельные операции, а также более сложные DAG структуры.
  • Использование как инструмента параллельных вычислений. Кроме сетевых задач, мы также включаем расписание вычислительных задач. Все типы задач могут быть помещены в один поток.
  • Использование как инструмента асинхронного чтения/записи файлов на платформе Linux, превышающего производительность любого стандартного вызова. Чтение/запись дисков также является задачей.
  • Реализация высокопроизводительных и масштабируемых backend сервисов с очень сложными вычислительными и коммуникационными связями.
  • Создание микросервисных систем.
    • Проект включает функциональность управления службами и балансировки нагрузки.
  • Wiki ссылка: PaaS Архитектурная диаграмма

Компиляция и среда выполнения

  • Проект поддерживает операционные системы Linux, macOS, Windows, Android и другие.
    • Версия для Windows доступна в ветке windows, использует реализацию асинхронной сети через iocp. Интерфейсы пользователя совместимы с версией для Linux.
  • Поддерживает все CPU платформы, включая 32 или 64-битные x86 процессоры, big-endian или little-endian arm процессоры, а также процессоры Loongson.
  • Нуждается в зависимости от OpenSSL, рекомендовано использование версий 1.1 и выше.
    • Для пользователей, предпочитающих отказаться от SSL, предлагается ветка nossl, где код более простой.
  • Проект использует стандарт C++11, требуется компилятор, поддерживающий этот стандарт. Однако проект не зависит от boost или asio.
  • Проект не имеет других зависимостей. При использовании протокола kafka потребуется установка библиотек сжатия lz4, zstd и snappy.

Быстрый старт (Linux, macOS):

git clone https://github.com/sogou/workflow # Из Gitee: git clone https://gitee.com/sogou/workflow
cd workflow
make
cd tutorial
make

Использование SRPC инструмента (НОВОЕ!)

Инструмент SRPC позволяет создать полный проект workflow, генерирует соответствующую структуру сервера, клиента или прокси, а также файлы конфигурации JSON и CMake. Инструмент автоматически скачивает минимально необходимые зависимости, такие как protobuf при указании создания RPC проекта. Подробное описание использования SRPC можно найти здесь: https://github.com/sogou/srpc/blob/master/tools/README_cn.md

Установка на Debian Linux или Ubuntu с помощью apt-get:

Как часть стандартного пакета для Debian Linux и Ubuntu 22.04, можно установить пакеты разработки командой:

sudo apt-get install libworkflow-dev

или среду выполнения:

sudo apt-get install workflow1

Обратите внимание, что Ubuntu предоставляет workflow только начиная с версии 22.04. Рекомендуется использовать git для получения последней версии исходного кода и компиляции.

Установка на Fedora Linux с помощью dnf:

Workflow также является стандартным пакетом для Fedora Linux, и можно установить пакеты разработки командой:

sudo dnf install workflow-devel

или среду выполнения:

sudo dnf install workflow

Использование xmake

Для сборки workflow с помощью xmake, см. документацию xmake.# Примеры руководства

Программная парадигма

Программа = Протокол + Алгоритм + Рабочий процесс

  • Протокол
    • В большинстве случаев пользователи используют встроенные общие сетевые протоколы, такие как http, redis или различные rpc.
    • Пользователи могут легко создать свои собственные сетевые протоколы, предоставляя функции сериализации и десериализации.
  • Алгоритм
    • В нашем дизайне алгоритмы являются противоположностью протоколов.
      • Если вызов протокола это rpc, то вызов алгоритма это apc (Asynchronous Procedure Call).
    • Мы предоставляем некоторые общие алгоритмы, такие как сортировка, слияние, psort, reduce, которые можно использовать сразу.
    • Самостоятельное создание алгоритмов встречается гораздо чаще, чем самостоятельное создание протоколов. Любая сложная вычислительная задача должна быть упакована в виде алгоритма.
  • Рабочий процесс
    • Рабочий процесс — это реальная бизнес-логика, которая представляет собой применение разработанных протоколов и алгоритмов в рамках определенного процесса.
    • Типичный рабочий процесс представляет собой замкнутую последовательность или параллельную структуру. Сложная бизнес-логика может представлять собой не замкнутую DAG структуру.
    • Рабочие процессы могут быть созданы напрямую или динамически на основе каждого шага. Все задачи выполняются асинхронно.Структурированный параллелизм и скрытие задач
  • В нашей системе есть пять основных типов задач: коммуникация, вычисления, файловый I/O, таймеры и счетчики.
  • Все задачи создаются задачником, пользователи организуют параллелизм через вызовы API. Например, последовательность, параллельность, DAG и так далее.
  • В большинстве случаев задачи, созданные через задачник, скрывают несколько асинхронных процессов, но пользователи этого не замечают.
    • Например, один HTTP-запрос может содержать множество асинхронных процессов (DNS, переадресацию), но для пользователя это просто одна задача коммуникации.
    • Сортировка файлов кажется одной задачей алгоритма, но на самом деле она включает сложные процессы чтения/записи файла и вычислений.
    • Если представить бизнес-логику как электронную схему, каждая схема может быть сложной внутри себя.
    • Механизм скрытия задач значительно снижает количество задач, которое пользователь должен создать, и глубину обратных вызовов.
  • Каждая задача работает в рамках некоторого последовательного потока (series), используя контекст series, что делает передачу данных между асинхронными задачами простой. Обратные вызовы и механизмы сборки мусора
  • Все вызовы выполняются асинхронно, практически нет ситуаций, когда поток занят ожиданием.
  • Явная система обратных вызовов. Пользователи знают, что они пишут асинхронные программы.
  • С помощью системы жизненного цикла объектов значительно упрощается управление памятью в асинхронных программах
    • Жизненный цикл задач, созданных любым фреймворком, начинается с момента создания и заканчивается выполнением callback-функции. Нет риска утечки памяти.
      • Если после создания задачи вы не хотите её запускать, вам следует использовать метод dismiss() для удаления.
    • Данные внутри задач, такие как resp сетевых запросов, также будут собраны вместе с задачей. В этом случае пользователи могут использовать std::move() для перемещения необходимых данных.
    • В проекте не используются никакие умные указатели для управления памятью. Код выглядит свежо и чисто.
  • По возможности избегайте производной реализации уровня пользователя, используйте std::function для упаковки поведения пользователя, включая:
    • Callback для любой задачи.
    • Обработка любого сервера. Соответствует идеологии FaaS (Функция как услуга).
    • Реализация алгоритма, можно сказать, это тоже std::function.
    • При более глубоком использовании будет заметно, что всё может быть производной.

Возникли вопросы при использовании?

Вы можете сначала проверить ЧАВО и список issues, возможно, там уже есть ответы.
Мы очень рады принять ваши вопросы, возникающие при использовании, отправленные на issues. Мы будем первыми отвечать на них. Кроме того, больше issues поможет новым пользователям.
Вы также можете связаться с нами через QQ-группу: 618773193

qq_qrcode

GitLab репозиторий

Пользователи могут использовать наш официальный репозиторий на Gitee при возникновении трудностей с доступом к GitHub: https://gitee.com/sogou/workflow
Также просим пользователей, которые starred проект на Gitee, также star'нуть репозиторий на GitHub. Спасибо!

Опубликовать ( 0 )

Вы можете оставить комментарий после Вход в систему

1
https://api.gitlife.ru/oschina-mirror/sogou-workflow.git
git@api.gitlife.ru:oschina-mirror/sogou-workflow.git
oschina-mirror
sogou-workflow
sogou-workflow
master