UNISTACK
NFX – не библиотека
NFX – не фреймворк
NFX – не .net framework
NFX – стек технологий реализованный на C# и использующий BCL.
UNISTACK
Все базовые компоненты необходимые для создания приложений
(можно разработать полноценное 3х-звенное self-hosted приложение с
контейнером, моделью безопасности, генерируемым по модели UI,
логированием, конфигурацией, работой с БД и возможностью работать
под любой платформой, используя только одну библиотеку)
UNISTACK
Было: Стало:
<?xml version="1.0" encoding="utf-8"?>
<packages>
<package id="NFX" version="2.0.0.11" targetFramework="net451" />
</packages>
UNISTACK
• Контейнер приложения
• Унификация типов приложений: единая инфраструктура для console, web, service, win forms
• Relational DB / NoSQL scaffolding/DAL
• GDID – глобальный распределенный идентификатор для распределенных БД
• Ультраэффективная бинарная сериализация
• Contract-based межпроцессное взаимодействие 32.000 2way операций в секунду для бизнес-данных
• Локальные или распределенные кучи (Pile), позволяющие хранить 10^9 объектов без самоубийства GC
• Гибридный легковесный веб-сервер WAVE на замену IIS
• Поддержка Erlang в CLR
• Виртуальная модель документа с конвертацией в pdf, html и другие форматы
• Виртуальные файловые системы (AmazonS3, SVN, GoogleDrive)
• Виртуальные платёжные системы (Stripe, Bank, Taxation, Paypal)
• Виртуальные социальные сети (Twitter, Facebook)
• DI, движок конфигурирования, логирование, модель безопасности, Cache, движок шаблонизации для
произвольных форматов, реализация MVC для web-приложений, драйвер для Mongo, встроенный proxy/firewall
уровня приложения
UNISTACK
• Не использует платформозависимые функции (kernel, gdi)
• Не использует платформозависимые технологии (COM, Active directory,
IIS, MS SQL Server)
• Не использует внешние .net-зависимости (MsTest, asp.net, mvc, wcf,
wpf, phone, serialization)
• Не использует никаких зависимостей вообще (log4net/nLog,
ServiceStack, Unity)
• Отказ от MS-сериализаторов, тяжеловесных объектов, async/await,
Entity
• Компонентная модель в рамках App-container: возможность изменять
свойства/сервисы в runtime и получать текущую телеметрию
5 мегабайт
NFX.Serialization.Slim.SlimSerializer
• Object Instance Teleportation
• Динамическая генерация кода сериализации/десериализации во время выполнения для
каждого типа
• прямая сериализация всех CLR-типов, примитивных структур и их Nullable эквивалентов
(DateTime, Timespan, Amount, GDID, FID, GUID, ConcurrentDictionary, MethodSpec, TypeSpec
etc.)
• прямая сериализация основных reference-типов (byte[], char[], string[])
• поддержка классов и структур с read-only полями
• поддержка custom-сериализации ISerializable, OnSerializing, OnSerialized… etc.
• каскадно-вложенная сериализация (например, какой-то тип делает custom-сериализацию
себя и должен вызвать SlimSerializer для какого-то поля)
• позволяет сериализировать любые поддерживаемые типы (кроме делегатов) в корень
• нормализует графы любой сложности и вложенности
• не требует дополнительной разметки на сериализуемых типах
NFX.Serialization.Slim.SlimSerializer
Сериалзиатор Класс с 20 полями простых и nullable-
типов, массивами и ссылками на
объекты того же класса
Object-граф из нескольких десятков
взаимно ссылающихся объектов,
включая массивы и списки
SlimSerializer, сериализация 460.000 об/сек 94 байта 12.000 об/сек 4.466 байт
SlimSerializer, десериализация 331.000 об/сек 11.500 об/сек
BinaryFormatter, сериализация 34.700 об/сек 1188 байт 2.000 об/сек 7.393 байт
BinaryFormatter, десериализация 42.700 об/сек 2.200 об/сек
DataContractSerializer, сериализация 109.000 об/сек 773 байта 4.000 об/сек 20.246 байт
DataContractSerializer, десериализация 42.000 об/сек 1.510 об/сек
NFX.Glue
• 10.000 строк кода в реализации
• Sync-TCP, async-TCP, In-process биндинги
• Прозрачная сериализация, не нужно атрибутов для данных ([DataContract],
[DataMember])
• Stateless или statefull на выбор. Сохранение состояния при перезагрузке процесса
• Встроенная статистика по вызовам, размеру передаваемых данных;
• Поддержка заголовков сообщений
• Поддержка фильтрации сообщений
• Прямой marshalling аргументов для устранения лишних упаковок/распаковок
• До 120.000 вызовов в секунду для two-way call
• До 500.000 вызовов в секунду для one-way call
NFX.Pile
Гибридный менеджер памяти с 100% managed code.
public interface IPile : IPileStatus, IApplicationComponent
{
PilePointer Put(object obj, uint lifeSpanSec = 0);
object Get(PilePointer ptr);
bool Delete(PilePointer ptr, bool throwInvalid = true);
int SizeOf(PilePointer ptr);
long Compact();
}
NFX.Pile
Native .NET+GC (GC in the «Server»
mode)
Pile
Средний размер объекта, с учётом
фрагментации
144 байта 75 байт
Стабильная работа без
существенного замедления
~20.000.000 объектов ~600.000.000 объектов (кончилась
физическая память)
Скорость записи 800.000 объектов / секунду 500.000 объектов / секунду
Скорость чтения параллельного
записи
1.000.000 объектов / секунду 700.000 объектов / секунду
Количество занятой процессом
памяти
10 Gb 84 Gb для 10^9 объектов
Сборка мусорва, секунд 1-2,5 0
Полная сборка мусора, секунд 2-6 <0,030
Работа в режиме cache – expiration,
свойства объекта.
- +
Декларативный bootstraper
Application
{
data-store
{
type="NFX.DataAccess.MySQL.MySQLDataStore, NFX.MySQL"
connect-string="Server=localhost;Database=contacts;Uid=root;Pwd=mathf1235"
script-assembly="Wave.DbApplication"
}
wave
{
server
{
prefix { name="http://localhost:8080/" }
dispatcher
{
filter
{
order=1
name="DumpErrors"
type="NFX.Wave.Filters.ErrorFilter, NFX.Wave"
show-dump
{
match { name="localhost"}
}
}
handler
{
order=0
type="NFX.Wave.Handlers.FileDownloadHandler, NFX.Wave"
root-path=$"Resources/"
match { path="/res/{*filePath}" }
}
handler
{
order=100
name="Stock Content Embedded Site"
order=1000
type="NFX.Wave.Handlers.StockContentSiteHandler, NFX.Wave"
match{ path="/stock/{*path}"}
}
handler
{
order=200
type="NFX.Wave.Handlers.MVCHandler, NFX.Wave"
type-location { assembly="Wave.DbApplication.exe" ns {
name="Wave.DbApplication.Controllers" } }
match { path="/{type=Contacts}/{mvc-action=Index}" var { query-name="*" }
}
}
}
}
}
}
Унифицированный движок конфигурации для любых компонент.
Декларативная инъектирование/настройка/запуск сервисов в контейнер приложения
Декларативный bootstraper. Scripting
Root
{
a=12
b=true
var1=0{script-only=true}
var2=175.4{script-only=true}
var3=true{script-only=true}
_block
{
_set{ path=/var1 to='((?$(/var3);$(/var2);-10)+100)+kozel' }
RESULT=$(/var1){}
}
}
Декларативный bootstraper. Net gate
Gate
{
name='Default Gate'
enabled = true
incoming
{
default-action=allow
rule{name='AdminAccess' order=1 action=deny from-addrs='170.12.14.12;170.12.14.13'}
rule{name='Workgroups' order=2 action=deny from-groups='home,work'}
group
{
name='home‘
address{name='Alex Berg Home' patterns='14.2.1*'}
address{name='Denis Rozotoks Home' patterns='3.118.2.12,3.118.2.13,3.118.2.14'}
}
group
{
name='work'
address{name='Alex Berg Office' patterns='45.2.2.12,45.2.2.75'}
address{name='Denis Rozotoks Office' patterns='77.123.1.14'}
}
}
}
Работа с декартовой геометрией
и координатами
Расстояние, периметры, поиск пересечений фигур/лучей, полярные координаты, отображение
направления по координатам.
[TestCase]
public void FromDegreeString_Distance_CLE_LA()
{
var cleveland = new LatLng("41°29'13'', -81°38'26''");
var losangeles = new LatLng("34°9'40'', -117°56'48''");
var dist = cleveland.HaversineEarthDistanceKm(losangeles);
Console.WriteLine(dist);
Assert.AreEqual(3265, (int)dist);
}
Logging
• Синхронная/асинхронная модели работы
• Коннекторы: MsSQLServer, SMTP, CSV file, debug file, MongoDB,
Composite, AsyncComposite, *nix Syslog
• Фильтры: уровень сообщения, дни недели, диапазон часов/дат,
паттерны сообщений. Инъектируемые внешние фильтры.
• SLA, Failovers (если логирование в A неудачно, то логировать в B)
• Flood-фильтр
• Интеграция с Trace/Debug
• Готовая интеграция в NFX-компоненты
NFX.Wave
5 мегабайт
https://github.com/aumcode/nfx C# Server UNISTACK framework
https://github.com/aumcode/serbench CLR Serializer Benchmark Suite
https://github.com/aumcode/nfx-demos NFX Demo Apps / Use-cases
https://github.com/aumcode/nfx/blob/master/CONTRIBUTING.md

NFX

  • 2.
    UNISTACK NFX – небиблиотека NFX – не фреймворк NFX – не .net framework NFX – стек технологий реализованный на C# и использующий BCL.
  • 3.
    UNISTACK Все базовые компонентынеобходимые для создания приложений (можно разработать полноценное 3х-звенное self-hosted приложение с контейнером, моделью безопасности, генерируемым по модели UI, логированием, конфигурацией, работой с БД и возможностью работать под любой платформой, используя только одну библиотеку)
  • 4.
    UNISTACK Было: Стало: <?xml version="1.0"encoding="utf-8"?> <packages> <package id="NFX" version="2.0.0.11" targetFramework="net451" /> </packages>
  • 5.
    UNISTACK • Контейнер приложения •Унификация типов приложений: единая инфраструктура для console, web, service, win forms • Relational DB / NoSQL scaffolding/DAL • GDID – глобальный распределенный идентификатор для распределенных БД • Ультраэффективная бинарная сериализация • Contract-based межпроцессное взаимодействие 32.000 2way операций в секунду для бизнес-данных • Локальные или распределенные кучи (Pile), позволяющие хранить 10^9 объектов без самоубийства GC • Гибридный легковесный веб-сервер WAVE на замену IIS • Поддержка Erlang в CLR • Виртуальная модель документа с конвертацией в pdf, html и другие форматы • Виртуальные файловые системы (AmazonS3, SVN, GoogleDrive) • Виртуальные платёжные системы (Stripe, Bank, Taxation, Paypal) • Виртуальные социальные сети (Twitter, Facebook) • DI, движок конфигурирования, логирование, модель безопасности, Cache, движок шаблонизации для произвольных форматов, реализация MVC для web-приложений, драйвер для Mongo, встроенный proxy/firewall уровня приложения
  • 6.
    UNISTACK • Не используетплатформозависимые функции (kernel, gdi) • Не использует платформозависимые технологии (COM, Active directory, IIS, MS SQL Server) • Не использует внешние .net-зависимости (MsTest, asp.net, mvc, wcf, wpf, phone, serialization) • Не использует никаких зависимостей вообще (log4net/nLog, ServiceStack, Unity) • Отказ от MS-сериализаторов, тяжеловесных объектов, async/await, Entity • Компонентная модель в рамках App-container: возможность изменять свойства/сервисы в runtime и получать текущую телеметрию
  • 7.
  • 8.
    NFX.Serialization.Slim.SlimSerializer • Object InstanceTeleportation • Динамическая генерация кода сериализации/десериализации во время выполнения для каждого типа • прямая сериализация всех CLR-типов, примитивных структур и их Nullable эквивалентов (DateTime, Timespan, Amount, GDID, FID, GUID, ConcurrentDictionary, MethodSpec, TypeSpec etc.) • прямая сериализация основных reference-типов (byte[], char[], string[]) • поддержка классов и структур с read-only полями • поддержка custom-сериализации ISerializable, OnSerializing, OnSerialized… etc. • каскадно-вложенная сериализация (например, какой-то тип делает custom-сериализацию себя и должен вызвать SlimSerializer для какого-то поля) • позволяет сериализировать любые поддерживаемые типы (кроме делегатов) в корень • нормализует графы любой сложности и вложенности • не требует дополнительной разметки на сериализуемых типах
  • 9.
    NFX.Serialization.Slim.SlimSerializer Сериалзиатор Класс с20 полями простых и nullable- типов, массивами и ссылками на объекты того же класса Object-граф из нескольких десятков взаимно ссылающихся объектов, включая массивы и списки SlimSerializer, сериализация 460.000 об/сек 94 байта 12.000 об/сек 4.466 байт SlimSerializer, десериализация 331.000 об/сек 11.500 об/сек BinaryFormatter, сериализация 34.700 об/сек 1188 байт 2.000 об/сек 7.393 байт BinaryFormatter, десериализация 42.700 об/сек 2.200 об/сек DataContractSerializer, сериализация 109.000 об/сек 773 байта 4.000 об/сек 20.246 байт DataContractSerializer, десериализация 42.000 об/сек 1.510 об/сек
  • 10.
    NFX.Glue • 10.000 строккода в реализации • Sync-TCP, async-TCP, In-process биндинги • Прозрачная сериализация, не нужно атрибутов для данных ([DataContract], [DataMember]) • Stateless или statefull на выбор. Сохранение состояния при перезагрузке процесса • Встроенная статистика по вызовам, размеру передаваемых данных; • Поддержка заголовков сообщений • Поддержка фильтрации сообщений • Прямой marshalling аргументов для устранения лишних упаковок/распаковок • До 120.000 вызовов в секунду для two-way call • До 500.000 вызовов в секунду для one-way call
  • 11.
    NFX.Pile Гибридный менеджер памятис 100% managed code. public interface IPile : IPileStatus, IApplicationComponent { PilePointer Put(object obj, uint lifeSpanSec = 0); object Get(PilePointer ptr); bool Delete(PilePointer ptr, bool throwInvalid = true); int SizeOf(PilePointer ptr); long Compact(); }
  • 12.
    NFX.Pile Native .NET+GC (GCin the «Server» mode) Pile Средний размер объекта, с учётом фрагментации 144 байта 75 байт Стабильная работа без существенного замедления ~20.000.000 объектов ~600.000.000 объектов (кончилась физическая память) Скорость записи 800.000 объектов / секунду 500.000 объектов / секунду Скорость чтения параллельного записи 1.000.000 объектов / секунду 700.000 объектов / секунду Количество занятой процессом памяти 10 Gb 84 Gb для 10^9 объектов Сборка мусорва, секунд 1-2,5 0 Полная сборка мусора, секунд 2-6 <0,030 Работа в режиме cache – expiration, свойства объекта. - +
  • 13.
    Декларативный bootstraper Application { data-store { type="NFX.DataAccess.MySQL.MySQLDataStore, NFX.MySQL" connect-string="Server=localhost;Database=contacts;Uid=root;Pwd=mathf1235" script-assembly="Wave.DbApplication" } wave { server { prefix{ name="http://localhost:8080/" } dispatcher { filter { order=1 name="DumpErrors" type="NFX.Wave.Filters.ErrorFilter, NFX.Wave" show-dump { match { name="localhost"} } } handler { order=0 type="NFX.Wave.Handlers.FileDownloadHandler, NFX.Wave" root-path=$"Resources/" match { path="/res/{*filePath}" } } handler { order=100 name="Stock Content Embedded Site" order=1000 type="NFX.Wave.Handlers.StockContentSiteHandler, NFX.Wave" match{ path="/stock/{*path}"} } handler { order=200 type="NFX.Wave.Handlers.MVCHandler, NFX.Wave" type-location { assembly="Wave.DbApplication.exe" ns { name="Wave.DbApplication.Controllers" } } match { path="/{type=Contacts}/{mvc-action=Index}" var { query-name="*" } } } } } } } Унифицированный движок конфигурации для любых компонент. Декларативная инъектирование/настройка/запуск сервисов в контейнер приложения
  • 14.
  • 15.
    Декларативный bootstraper. Netgate Gate { name='Default Gate' enabled = true incoming { default-action=allow rule{name='AdminAccess' order=1 action=deny from-addrs='170.12.14.12;170.12.14.13'} rule{name='Workgroups' order=2 action=deny from-groups='home,work'} group { name='home‘ address{name='Alex Berg Home' patterns='14.2.1*'} address{name='Denis Rozotoks Home' patterns='3.118.2.12,3.118.2.13,3.118.2.14'} } group { name='work' address{name='Alex Berg Office' patterns='45.2.2.12,45.2.2.75'} address{name='Denis Rozotoks Office' patterns='77.123.1.14'} } } }
  • 16.
    Работа с декартовойгеометрией и координатами Расстояние, периметры, поиск пересечений фигур/лучей, полярные координаты, отображение направления по координатам. [TestCase] public void FromDegreeString_Distance_CLE_LA() { var cleveland = new LatLng("41°29'13'', -81°38'26''"); var losangeles = new LatLng("34°9'40'', -117°56'48''"); var dist = cleveland.HaversineEarthDistanceKm(losangeles); Console.WriteLine(dist); Assert.AreEqual(3265, (int)dist); }
  • 17.
    Logging • Синхронная/асинхронная моделиработы • Коннекторы: MsSQLServer, SMTP, CSV file, debug file, MongoDB, Composite, AsyncComposite, *nix Syslog • Фильтры: уровень сообщения, дни недели, диапазон часов/дат, паттерны сообщений. Инъектируемые внешние фильтры. • SLA, Failovers (если логирование в A неудачно, то логировать в B) • Flood-фильтр • Интеграция с Trace/Debug • Готовая интеграция в NFX-компоненты
  • 18.
  • 19.
  • 20.
    https://github.com/aumcode/nfx C# ServerUNISTACK framework https://github.com/aumcode/serbench CLR Serializer Benchmark Suite https://github.com/aumcode/nfx-demos NFX Demo Apps / Use-cases https://github.com/aumcode/nfx/blob/master/CONTRIBUTING.md