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

OSCHINA-MIRROR/cxxjava-CxxConet

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

CxxConet

Основывающийся на корутинах фреймворк для разработки сетевых приложений на C++

Содержание

Особенности

  • Кроссплатформенность: одновременная поддержка Linux32/64 и OSX64, а также C++11 и более поздних версий;
  • Простота разработки: синхронный способ написания кода, поддерживающий фильтры Mina и простой, но мощный;
  • Высокая производительность: возможность обрабатывать большое количество соединений одновременно, безблокировочная архитектура, обеспечивающая превосходную производительность;
  • Многофункциональность: синхронные вызовы, поддержка защиты от перегрузки сети, автоматическое удаление неактивных соединений и другие функции корпоративного уровня.

Модель корутин

В рамках всего фреймворка CxxConet существует 4 типа рабочих корутин:

  • Корутина приёма соединений (socket acceptor);
  • Глобальная статистическая корутина;
  • Очищающая корутина (clean handler);
  • Обрабатывающая корутина ввода-вывода (connection handler).

Корутина приёма соединений: отвечает за приём новых клиентских подключений и создание обрабатывающих корутин ввода-вывода для обработки транзакций верхнего уровня каждого клиента.

Глобальная статистическая корутина: периодически собирает статистику по каждой корутине и реализует сбор данных без блокировок.

Очищающая корутина: регулярно очищает неактивные соединения, предотвращая истощение ресурсов.

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

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

Процесс коммуникации

IoAcceptor — это интерфейс, который отвечает за установление сокетных соединений.

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

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

Пример

#include "ENaf.hh"

static sp<ELogger> logger = ELoggerManager::getLogger("testnaf");

static void onListening(ESocketAcceptor* acceptor) {
    logger->trace("onListening...");

    while (!acceptor->isDisposed()) {
        sleep(10);

        EIoServiceStatistics* ss = acceptor->getStatistics();
        logger->trace_("ReadBytes=%ld", ss->getReadBytes());
        logger->trace_("WrittenBytes=%ld", ss->getWrittenBytes());
    }

    logger->trace("Out of Listening.");
}

static void onConnection(ESocketSession* session) {
    logger->trace("onConnection...");

    sp<EIoBuffer> request;
    while(!session->getService()->isDisposed()) {
        try {
            request = dynamic_pointer_cast<EIoBuffer>(session->read());
        } catch (ESocketTimeoutException& e) {
            logger->trace("session read timeout.");
            continue;
        } catch (EIOException& e) {
            logger->trace("session read error.");
            break;
        }
        if (request == null) {
            logger->trace("session client closed.");
            break;
        }

        // echo.
        session->write(request);
    }

    logger->trace("Out of Connection.");
}

int main(int argc, const char **argv) {
    // CxxJDK init.
    ESystem::init(argc, argv);
    // CxxLog4j init.
    ELoggerManager::init("log4e.conf");

    ESocketAcceptor sa;
    EBlacklistFilter blf;
    blf.block("localhost");
    sa.getFilterChainBuilder()->addFirst("black", &blf);
    sa.setListeningHandler(onListening);
    sa.setConnectionHandler(onConnection);
    sa.setMaxConnections(1000000);
    sa.setSoTimeout(3000);
    sa.setSessionIdleTime(EIdleStatus::WRITER_IDLE, 30);
    sa.bind("0.0.0.0", 8888);
    sa.listen();

    ESystem::exit(0);

    return 0;
}

Дополнительные примеры:
testnaf.cpp

Производительность

Тестовая программа:
см. пример кода на C++: benchmark.cpp;

Программное окружение:

# cat /etc/redhat-release 
CentOS release 6.4 (Final)
# uname -a
Linux cxxjava 2.6.32-358.el6.x86_64 #1 SMP Fri Feb 22 00:31:26 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

Аппаратное окружение:

Тип устройства: R6240-12
Название процессора: Intel Xeon E5606
Скорость процессора: 2,13 ГГц
Количество процессоров: 4
Общее количество ядер: 8

Результаты тестирования:

# ab -c 20 -n 50000  http://localhost:8888/
Это ApacheBench, версия 2.3 <$Revision: 655654 $>
Авторское право 1996 Адам Твисс, Zeus Technology Ltd, http://www.zeustech.net/
Лицензия предоставлена The Apache Software Foundation, http://www.apache.org/

Бенчмаркинг localhost (будьте терпеливы)
Завершено 50 000 запросов
Завершено 10 000 запросов
Завершено 15 000 запросов
Завершено 20 000 запросов
Завершено 25 000 запросов
Завершено 30 000 запросов
Завершено 35 000 запросов
Завершено 40 000 запросов
Завершено 45 000 запросов
Завершено 50 000 запросов
Закончено 50 000 запросов


Программное обеспечение сервера:
Имя хоста сервера: localhost
Порт сервера: 8888

Путь к документу: /
Длина документа: 3 байта

Уровень параллелизма: 20
Время, затраченное на тесты: 4,077 секунды
Полные запросы: 50 000
Неудачные запросы: 0
Ошибки записи: 0
Всего передано: 2 050 328 байт
Передано HTML: 150 024 байта
Запросы в секунду: 12 264,64 [#/сек] (среднее значение)
Время на запрос:
``` 1.631 [мс] (среднее значение)

Время на запрос: 0,082 [мс] (среднее по всем одновременным запросам)
Скорость передачи данных: получено 491,14 [Кбайт/сек]

**Время соединения (мс)**
| | мин | среднее [+/- стандартное отклонение] | медиана | макс |
|:--:|:---:|:------------------------------------:|:-----:|:----:|
| Подключение | 0 | 1 | 0,1 | 1 | 4 |
| Обработка | 0 | 1 | 0,3 | 1 | 16 |
| Ожидание | 0 | 1 | 0,3 | 1 | 16 |
| Общее | 0 | 2 | 0,3 | 2 | 17 |

Процент запросов, выполненных за определённое время (мс)
|  | 50% | 66% | 75% | 80% | 90% | 95% | 98% | 99% | 100% (самый долгий запрос) |
|---|---|---|---|---|---|---|---|---| ---|
|   | 2  | 2  | 2  | 2  | 2  | 2  | 2  | 2  | 17  |

#### Зависимости
1. CxxJDK (https://github.com/cxxjava/CxxJDK)
2. CxxFiber (https://github.com/cxxjava/CxxFiber)
3. CxxLog4j (https://github.com/cxxjava/CxxLog4j)

#### Поддержка
Email: cxxjava@163.com

Комментарии ( 0 )

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

Введение

Описание недоступно Развернуть Свернуть
Apache-2.0
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/cxxjava-CxxConet.git
git@api.gitlife.ru:oschina-mirror/cxxjava-CxxConet.git
oschina-mirror
cxxjava-CxxConet
cxxjava-CxxConet
master