Pull to refresh
10
0
Muhamad Zununov @VanquisherWinbringer

CIO

Send message

Продакты про в B2C про это говорят - Пользователю надо давать не то что он думает что он хочет а то что ему на самом деле нужно. (С): Хотя оно такое - если по этому принципу действовать то производители сигарет давно бы перестали выпускать сигареты и начали бы производить антидепрессанты и оказывать услуги онлайн психологов. Се Лави.

YandexGo приложением пользовались? Там внутри одного приложения можно запустить другое как часть его - например Яндекс.Еда. Так вот это оно.

1) Почему если есть планы ехать на ПМЖ то открывать надо LLC?
2) В таком случае LLC надо открывать в Делавэре или в том штате где жить собираемся?

Хм, я довольно своеобразным образом очень планов из геымдева в Финтех перешёл а потом в e-commerce ритейл с фудтехом. Дело было так: Я делал сервер для онлайн игры типичной с прокачной навыков, боями с боссами, покупкой предметов. Потом перешёл в беттинг который по сути геймдев + Финтех в одном флаконе. Там тоже делал сервер с кошельками, счетами и валютой. Потом перешёл работать в тру Финтех со счетами, проводками и всем этим.

Думаю что в будущем из концепции роботы удобные для складов прийдут к концепции склады удобные для роботов.

ChatGPT такой же инструмент для работы как калькулятор или Гугл Таблицы поэтому ответ можно ли его использовать зависит скорее от того какая поставленна задача и какие ограничения на безопасность есть у компании.

Потому что часть IT это бизнесмены и стартаперы которые новые сервисы в малекних компаниях запускают. Другая часть это ребята которые от звонка до звонка работают в больших компаниях и дорабатывают Легаси. Когорта совсем разных людей.

Хм. Я сейчас пишу третью часть. Ответы на какие вопросы вы бы хотели в ней видеть по поводу команды в матричной структуре?

Вообще есть и корреляция и комутативность и идемпотентность. Ну и конечно сохранение данных. Стей саги в БД храниться обычно. Хотя есть возможность просто InMemory ну это больше для тестов. Транзакционность между своими состояними он тоже обеспеспечивает если вы Postgres в качестве хранилища используете. Транзакционность всей оперции - ну это такое. Суть паттерна Saga в том что она это обеспечивает набором компенсирующих действий. OutBox в MT вообще есть. В примере кода есть строчка где он подключается. У меня уже складывается ощуние что статью вы не читали. Это вообще учитывая что она вводная и послее нее хорошо бы пойти почитать документацию к MT.

1) Можно послать компенсирующу SMS с информацией что предыдущая была ошибочной.

2) Там любые действия идут с ретраями. В том числе и выполение позитивного действия. MS Saga это стейт машина. Если вы перешли в стейт из которого дальше нужно откатывать то она будет после востановления пытаться откатывать. Если в стейте на котором нужно выполнить действие то после востановления будет пытаться выполнить действие. В общем стейт машина будет пытаться продолжать с того момента на котором остановилась.

3) Вообще есть в OutBox в MassTransit. Ваш пример вообще не понятно как работает в реальном приложении. Где там идемпотентность? Где коммутативность? Где корреляция по одной бизнес операции? Что произойдет если в
}.onError {  step { if (clientId!=null) clientService.remove(clientId) }  step { if (identityId!=null) identityService.remove(identityId) }}.async()
на втором шаге произойдет падение? что произойдет если не remove будет у вас а какой нибудь запрос например на увеличение счетчика т. е. не идемпотентный? Если запрос бросит ошибку из-за прервывания сети на моменте ответа уже увеличив какой-то счетчик? Я вижу какой-то DSL. Возможно за ним какая-то магия, только непонятно как она работает. Почему вы не отделяете ошибочные ответы просто от таймаутов? Вообще можно в MT 1 в 1 сделать такой же пример как у вас. Будет только + код для обьявления контрактов и стейтов дополнительный. Позже пример вашей операции на MT сделаю после работы. MT очень гибкий иструменты который позволяет всякими такими ньюансами управлять когда надо. Да очень простой OutBox. Если нужен сильный OutBox то он есть у NServiceBus (брат близнец MT) - Outbox • NServiceBus • Particular Docs

Отличный пример - тут так же в MassTransit будет за исключением что не будет одного onError а будет два шага отката. Потому что две транзакции это будет. Первая откатит первый запрос, а вторая второй. Тут под капотом чтобы реализовать такое все равно надо делать чезе две транзации и нужная более низкоуровневая библиотека вроде MassTransit для этого. В первой транзакции  step { if (clientId!=null) clientService.remove(clientId) } выполняем и сохраняем в БД что эту операцию откатили. Во второй транзакции сохраняем step { if (identityId!=null) identityService.remove(identityId) }. Если упали то MassTransit перезапуститься и посмотрит из БД что первый шаг он уже откатил и сразу пойдет откатывать второй шаг.

Судя по ващим коментариям вы вообще не понимаете о чем идет речь. Так даже и нет примера для случая когда у вас есть внешнее API от Google и API от Facebook и вам нужно сделать запрос в одно потом в другое и если провалилось первое то сделать компенсирующее запросы для второго. В реальных приложениях не все сервисы к которым вы делаете запросы вы контролируете. В какую-то пратежную систему, сделать запрос, потом в API службы доставкий какой-то. Да, можно используя MassTransit сделать еще слой асбстракции и выставить наружу API как будто одним действием это делается однако под капотом оно не так.

Хм, точно так же пишеться все как и в MassTransit судя по примерам что я посмотрел.

Безнес операция в распределенной системе это совсем другое. Вообще про распределенные системы для начала почитайте прежде чем такие заявления делать. В целом MassTransit как библиотека для распределенных систем и так довольно жирный слой абстракции дает и многое на себя берет позволяя на его DSL писать более менее простой воркфлоу. Мне интересно как вы себе преставляет простое рещение когда у вас надо изменить данные в БД микросервиса А и микросервиса Б согласованно чтобы соблюдался хотяб ACD из ACID? Притом что один из них или оба вообще не принадлежат ващей компании. Сервисы Google и Facebook например. Пример кода привидите.

1, 2, 3 - Зависит от реализации. MassTransit старается от этого абстрагироваться.

4) Суть саги в том что это набор мелких транзакций. Так или иначе компенсаций это тоже будет несколько мелких транзакций. Можно в том числе в стаье от Avito про это почитать.
5) Чем HttpClient лучше temporal.io? Как Camunda сделана с помошью Zeebe так и вы можете сделать свой temporal.io с помошью MassTransit и еще кучи других библиотек.

Отличная статья. Закинул нашим почитать.

Спасибо за полезный коментарий. Вечером дополню статью.

Подробнее о отложенных сообщениях для Таймаутов можно почитать тут MassTransit Schedule
Вот пример того как сделать Таймаут для саги

https://masstransit-project.com/usage/sagas/automatonymous.html#schedule

public interface OrderCompletionTimeoutExpired
{
    Guid OrderId { get; }
}

public class OrderState :
    SagaStateMachineInstance
{
    public Guid CorrelationId { get; set; }
    public string CurrentState { get; set; }

    public Guid? OrderCompletionTimeoutTokenId { get; set; }
}

public class OrderStateMachine :
    MassTransitStateMachine<OrderState>
{
    public OrderStateMachine()
    {
        Schedule(() => OrderCompletionTimeout, instance => instance.OrderCompletionTimeoutTokenId, s =>
        {
            s.Delay = TimeSpan.FromDays(30);

            s.Received = r => r.CorrelateById(context => context.Message.OrderId);
        });
        
        During(Accepted,
            When(OrderCompletionTimeout.Received)
                .PublishAsync(context => context.Init<OrderCompleted>(new { OrderId = context.Saga.CorrelationId }))
                .Finalize());
    }

    public Schedule<OrderState, OrderCompletionTimeoutExpired> OrderCompletionTimeout { get; private set; }
}

1
23 ...

Information

Rating
Does not participate
Location
Россия
Registered
Activity

Specialization

Chief Technology Officer (CTO), Chief information officer (CIO)
C#
Software development
Project management
Product management
Development management
Agile
Scrum
Kanban
Development of tech specifications
Scala