2. UNISTACK
NFX – не библиотека
NFX – не фреймворк
NFX – не .net framework
NFX – стек технологий реализованный на C# и использующий BCL.
3. UNISTACK
Все базовые компоненты необходимые для создания приложений
(можно разработать полноценное 3х-звенное self-hosted приложение с
контейнером, моделью безопасности, генерируемым по модели UI,
логированием, конфигурацией, работой с БД и возможностью работать
под любой платформой, используя только одну библиотеку)
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 и получать текущую телеметрию
8. 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 для какого-то поля)
• позволяет сериализировать любые поддерживаемые типы (кроме делегатов) в корень
• нормализует графы любой сложности и вложенности
• не требует дополнительной разметки на сериализуемых типах
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 (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,
свойства объекта.
- +
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-компоненты