Похожие презентации:
Настоящие секреты разработки в HCM
1. Настоящие секреты разработки в HCM
НАСТОЯЩИЕСЕКРЕТЫ
РАЗРАБОТКИ В HCM
«СЕКРЕТОВ» НА САМОМ ДЕЛЕ НЕТ, ЕСТЬ «КОСТЫЛИ», Т.Е. КОМПРОМИССЫ.
30-31 марта 2023
AZIMUT Сити Отель Олимпик Москва
2. Настоящие секреты разработки в HCM
НАСТОЯЩИЕ СЕКРЕТЫ РАЗРАБОТКИ В HCMБаза данных
Данные в памяти
Веб сокеты
Очереди
Оценка производительности и отладка
Будущее
3. Предисловие / История в контексте ядра.
ПРЕДИСЛОВИЕ / ИСТОРИЯ В КОНТЕКСТЕ ЯДРА.Cluster
Azure Cloud
Azure SQL
Memory Cache
Fulltext index
2009 - 2012
64bit
.Net 3.4/4.0 COM
SPXML UNIBRIDGE
1.2
MSSQL / ORACLE
2008
xhttp kernel
2005
Linux
Deep .Net Integration
PostgreSQL
Redis
Queues
XQuery Extensions
2013-2018
.Net 6/7
Inventa Client
IDM
Mediasoup Embedded
VFS
Yandex Cloud
2019 - 2023
4. БАЗА ДАННЫХ. Постраничный доступ.
// Переборvar xq = XQuery(“for $elem in collaborators
order by $elem/id return $elem”);
// Постраничный доступ
var xq = XQuery(“for $elem in collaborators order
by $elem/id return $elem”,”PageSize=10”);
for (xqi in xq)
for (xqi in ArrayRange(xq,startPos,pageSize))
{
{
…
…
Response.Write(xqi.id);
}
Response.Write(xqi.id);
}
5. БАЗА ДАННЫХ. Условие с массивами идентификаторов.
//Стандартный массив идентификаторов//Специальный массив идентификаторов
var xq = XQuery(“for $elem in collaborators
where MatchSome($elem/id,(id1,id2,….idn))
var xq = XQuery(“for $elem_qc in collaborators
order by $elem/id return $elem”);
order by $elem_qc/id return
$elem”,”PageSize=10”);
for (xqi in xq)
for (xqi in ArrayRange(xq,startPos,pageSize))
{
{
where MatchSome($elem_qc/id,(id1,id2,….idn))
…
…
Response.Write(xqi.id);
}
Response.Write(xqi.id);
}
6. БАЗА ДАННЫХ. Условие с массивами идентификаторов.
Ограничения:• Никаких функций в MatchSome
• Никаких составных XQuery
• Нет параметризации запросов
7. БАЗА ДАННЫХ. Потоковое открытие документов.
// Прямое открытие документовvar xq = XQuery(“for $elem_qc in collaborators
where MatchSome($elem_qc/id,(id1,id2,….idn))
// Потоковое открытие документов
var xq = XQuery(“for $elem_qc in collaborators
where MatchSome($elem_qc/id,(id1,id2,….idn))
order by $elem_qc/id,$elem/__data return $elem”);
order by $elem_qc/id return $elem”);
for (xqi in xq)
for (xqi in xq)
{
{
var doc = OpenDoc(UrlFromDocID(xqi.id))
var doc = OpenDoc(UrlFromDocID(xqi.id))
…
…
Response.Write(xqi.id);
}
Response.Write(xqi.id);
}
8. БАЗА ДАННЫХ. Потоковое открытие документов.
Ограничения:• Работает только для цикла for
• Функция OpenDoc должна быть первой операцией с базой в
цикле
• Никаких вложенных XQuery
• Несовместим с ArrayRange
9. БАЗА ДАННЫХ. Составные запросы XQuery.
// Составные запросы XQueryvar xq = XQuery(“for $cl in collaborators, $gc in group_collaborators
where $cl/id=$gc/collaborator_id order by $cl/fullname
return $cl/id,$cl/fullname,$cl/code cl_code,$gc/code gc_code”);
for (xqi in xq)
{
…
Response.Write(xqi.cl_code);
Response.Write(xqi.gc_code);
}
10. БАЗА ДАННЫХ. Составные запросы XQuery.
Ограничения:• Работает только для spxml unibridge
• XQuery может быть только составным.
11. БАЗА ДАННЫХ. Массовые обновления документов.
// Прямое обновление документов// Массовое обновление документов
var xqc = XQuery("for $elem in
collaborators return
$elem/Fields('id','__data')");
for (xqi in xqc)
var xqc = XQuery("for $elem in collaborators return
elem/Fields('id’,’__data’)");
{
{
}
tools.spxml_unibridge.Object.provider.BeginBulkAtomic
Operation(1000);
for (xqi in xqc)
doc = OpenDoc(UrlFromDocID(xqi.id));
doc = OpenDoc(UrlFromDocID(xqi.id));
doc.TopElem.org_id = org_id;
doc.TopElem.org_id = org_id;
doc.Save();
doc.Save();
…
…
}
tools.spxml_unibridge.Object.provider.EndBulkAtomicO
peration();
12. БАЗА ДАННЫХ. Массовые обновления документов.
Ограничения:• Работает только для spxml unibridge
• Все операции внутри блока
BeginBulkAtomicOperation/EndBulkAtomicOperation
обновляются в одной транзакции, поэтому запросы к
каталогам могут быть не корректными.
13. БАЗА ДАННЫХ. Особенности работы c PostgreSQL.
Ограничения:• Для XQuery требуется корректные типы параметров в
условиях.
• Многозначные поля имеют содержат тип массив, а не xml
14. Данные в памяти. Низкоуровневые функции.
Высокоуровневые функции: setuserdata / getuserdataНизкоуровневые функции:
Скалярные:
Get(key,region)
Put(key,object,expire,region)
Remove(key,region)
GetOrSet(key,value,expire,region)
SetExpiration(key,expire,region)
Векторные:
PutSet(key,value,region)
GetSet(key,region)
AddToSet(key,value,region)
RemoveFromSet(key,value,region)
RemoveSet(key,value,region)
15. Данные в памяти. Низкоуровневые функции.
Ограничения:• Работают только с примитивными сериализуемыми
типами spxml: int,string,real,int[],string[],real[]
• Кэш может быть подвергнут принудительному
освобождению, как локальный, так и redis.
16. Веб-сокеты.
Для реализации требуется:Соглашение для реализации веб-сокета.
service.xml – декларация web-service с методами accept/process/close
service.js – реализация методов accept/process/close
Код для потребления сервиса на стороне клиента.
Возможна также запись в сокеты на стороне на одном или нескольким узлов HCM.
Сервисные функции для работы с сокетами:
context = CurrentWebSocketContext
context.WebSocketCurrentId
context.WebSocketReceiveResultValue
GetWebSockets()
WriteToWebSocketMessageQueue(socketId, message, json_compound)
WriteToWebSocketsArrayMessage(socketIds, message, parallel_degree, exclude_own);
WriteToWebSocketsMessageQueueArray(socketIds, message, json_compound, parallel_degree,
exclude_own)
17. Очереди.
Известные часто-используемые функции:PutMessageInQueue(queue_name, message, region)
GetMessageFromQueue (queue_name, region)
Редко используемые функции:
• PeekMessagesFromQueue(queue_name, region, start, stop)
• PutMessageInQueue(queue_name, message, region, ttl, reserved, unique, channel,
channel_message)
• ClearMessagesInQueue(queue_name, region)
• QueueIndexOf(queue_name, message, region)
• QueueRemoveMessage(queue_name, message);
• QueueTrim(queue_name, start, stop, region)
• CompactMessageQueue(queue_name, region)
• PeekMessagesFromQueue(queue_name, region, start, stop)
• Subscribe(channel, func_handler, region)/Unsubscribe(channel, region)/IsSubscribed(channel, region)
18. Оценка производительности и отладка.
Отладка пока только «принтами».В x-shell это команды для включения журналов диагностики: debug ?
В xHttp.ini | spxml_unibridge_config.xml это параметры для ведения журналов диагностики.
debug dotnet on|off
debug vfs on|off
DOTNETCORE-DEBUG: 0|1
DOTNETCORE-DEBUG-VFS: 0|1
debug http on|off
debug all on|off
DOTNETCORE-XHTTP-DEBUG: 0|1
DOTNETCORE-XHTTP-DEBUG-CANCELLED: 0|1
DOTNETCORE-XHTTP-DEBUG-CONTROL-WEBSOCKETS: 0|1
DOTNETCORE-XHTTP-DEBUG-WEBSOCKETS-BODY: 0|1
DOTNETCORE-XHTTP-DEBUG-WEBSOCKETS-BODY-LEN: 256
DOTNETCORE-DEBUG-INVOKE-GLOBAl-ENV: 0|1
DOTNETCORE-DEBUG-NEURAL: 0|1
DOTNETCORE-DEBUG-MEDIA: 0|1
debug http on|off
DOTNETCORE-XHTTP-DEBUG: 0|1
debug spxml on|off
spxml_unibridge_config.xml
Mode: Normal|Debug
CacheDebug: On
19. Оценка производительности и отладка. Коллекции карт вызовов.
Старт / Стопxsh> collect callmap on|off
Информация по аргументам:
xsh> collect ?
Настройки для файлов коллекций:
CALL-MAP-DIR: call-maps
CALL-MAP-BUFFER-SIZE: 134217728
CALL-MAP-MAX-FILE-SIZE: 268435456
CALL-MAP-MAX-STR-ARG-SIZE: 256
20. Будущее…
База данных: OpenSearch, YDB, Mongo?Данные в памяти: Балансировка на N узлов
Веб сокеты: SignalR
Очереди: Возврат в очередь, RabbitMQ, YMQ
Отладка: VSCode Debugger Adapter, NetTrace
21.
ВопросыИ может быть ответы…