Разделы презентаций


Отправить всё! Поддержка офлайна в мобильном приложении. Рецепт от Solo

Содержание

Цель Поделиться подходом к неблокирующей отправке созданных пользователем данных на сервер

Слайды и текст этой презентации

Слайд 1Отправить всё! Поддержка офлайна в мобильном приложении. Рецепт от Solo
Владимир

Абакумов

Отправить всё!  Поддержка офлайна в мобильном приложении. Рецепт от SoloВладимир Абакумов

Слайд 2Цель
Поделиться подходом к неблокирующей отправке созданных пользователем данных на сервер

Цель	Поделиться подходом к неблокирующей отправке созданных пользователем данных на сервер

Слайд 3О чём пойдёт речь
Как «хорошо» отправлять данные на сервер:
концепция
варианты реализации
и

ещё пара рецептов

О чём пойдёт речьКак «хорошо» отправлять данные на сервер:концепцияварианты реализациии ещё пара рецептов

Слайд 4Чего не будет
Транзакционность

Чего не будетТранзакционность

Слайд 5Интро
Владимир Абакумов, TeamLead ОМР
DIRECTUM и DirectumRX
DIRECTUM Solo и Jazz

ИнтроВладимир Абакумов, TeamLead ОМРDIRECTUM и DirectumRXDIRECTUM Solo и Jazz

Слайд 6Отправка созданных пользователем данных
Блокируем работу

Отправка созданных пользователем данныхБлокируем работу

Слайд 7Отправка созданных пользователем данных
Блокируем работу
Просто и надежно
Ответственность на пользователе

Бесяче (╯

° □ °) ╯ (┻━┻) 

Отправка созданных пользователем данныхБлокируем работуПросто и надежноОтветственность на пользователеБесяче (╯ ° □ °) ╯ (┻━┻) 

Слайд 8Отправка созданных пользователем данных
Не блокируем работу

Отправка созданных пользователем данныхНе блокируем работу

Слайд 9Когда узнаешь, что данные пропали

Когда узнаешь, что данные пропали

Слайд 10Отправка созданных пользователем данных
Не блокируем работу
Не понятен статус

Отправка созданных пользователем данныхНе блокируем работуНе понятен статус

Слайд 11Отправка созданных пользователем данных
Не блокируем работу
Не понятен статус
Можно потерять данные

Отправка созданных пользователем данныхНе блокируем работуНе понятен статусМожно потерять данные

Слайд 12Отправка созданных пользователем данных
Не блокируем работу
Не теряем данные

Отправка созданных пользователем данныхНе блокируем работуНе теряем данные

Слайд 13Приложение для организации событий

Приложение для организации событий

Слайд 14Приложение для организации событий
Создаём событие, указывая реквизиты, участников
Добавляем фото места
Добавляем

новых участников

Приложение для организации событийСоздаём событие, указывая реквизиты, участниковДобавляем фото местаДобавляем новых участников

Слайд 15Задачи
Создать событие
Добавить фото:
Обработать фото (сжатие, фильтры);
Отправить файл на сервер и

получить URL;
Прикрепить к событию.
Добавить участников

ЗадачиСоздать событиеДобавить фото:Обработать фото (сжатие, фильтры);Отправить файл на сервер и получить URL;Прикрепить к событию.Добавить участников

Слайд 16Схема задач

Схема задач

Слайд 17Схема задач

Схема задач

Слайд 18Схема задач

Схема задач

Слайд 19Схема задач

Схема задач

Слайд 20Схема задач

Схема задач

Слайд 21Схема задач

Схема задач

Слайд 22Схема задач

Схема задач

Слайд 23Схема задач

Схема задач

Слайд 24Схема задач

Схема задач

Слайд 25Схема задач

Схема задач

Слайд 26Схема задач

Схема задач

Слайд 27Схема задач

Схема задач

Слайд 28Схема задач

Схема задач

Слайд 29Отправка созданных пользователем данных
Разбиваем задачи на атомарные подзадачи
Сохранение данных и

состояния задач
Семантически значимый ключ: EventID_TaskID_SubtaskID
Value в виде примитивных данных или

сериализуемых структур, которые переживут изменения из-за обновлений сущностей

Отправка созданных пользователем данныхРазбиваем задачи на атомарные подзадачиСохранение данных и состояния задачСемантически значимый ключ: EventID_TaskID_SubtaskIDValue в виде

Слайд 30Запросы и их задачи
Request = намерение
RequestTask = как его достичь

Запросы и их задачиRequest = намерениеRequestTask = как его достичь

Слайд 31Приложение для организации событий
Создаём событие CreateEventRequest
Добавляем фото места AddPhotoRequest
Добавляем новых

участников AddParticipantRequest

Приложение для организации событийСоздаём событие 			CreateEventRequestДобавляем фото места 		AddPhotoRequestДобавляем новых участников 	AddParticipantRequest

Слайд 32Приложение для организации событий
Request -> RequestTask

Приложение для организации событийRequest -> RequestTask

Слайд 33Интерфейс RequestTask
public interface IRequestTask { int Id { get; }
Request

Request { get; }
ExecutingState State { get; } Task

RunAsync(); void Load(IReadOnlyDictionary data); IReadOnlyDictionary Save(); }
Интерфейс RequestTaskpublic interface IRequestTask {  int Id { get; } Request Request { get; } ExecutingState

Слайд 34Интерфейс RequestTask
public interface IRequestTask { int Id { get; }
Request

Request { get; }
ExecutingState State { get; } Task

RunAsync(); void Load(IReadOnlyDictionary data); IReadOnlyDictionary Save(); }
Интерфейс RequestTaskpublic interface IRequestTask {  int Id { get; } Request Request { get; } ExecutingState

Слайд 35Интерфейс RequestTask
public interface IRequestTask { int Id { get; }
Request

Request { get; }
ExecutingState State { get; } Task

RunAsync(); void Load(IReadOnlyDictionary data); IReadOnlyDictionary Save(); }
Интерфейс RequestTaskpublic interface IRequestTask {  int Id { get; } Request Request { get; } ExecutingState

Слайд 36Интерфейс RequestTask
public interface IRequestTask { int Id { get; }
Request

Request { get; }
ExecutingState State { get; } Task

RunAsync(); void Load(IReadOnlyDictionary data); IReadOnlyDictionary Save(); }
Интерфейс RequestTaskpublic interface IRequestTask {  int Id { get; } Request Request { get; } ExecutingState

Слайд 37Интерфейс RequestTask
public interface IRequestTask { int Id { get; }
Request

Request { get; }
ExecutingState State { get; } Task

RunAsync(); void Load(IReadOnlyDictionary data); IReadOnlyDictionary Save(); }
Интерфейс RequestTaskpublic interface IRequestTask {  int Id { get; } Request Request { get; } ExecutingState

Слайд 38Интерфейс RequestTask
public interface IRequestTask { int Id { get; }
Request

Request { get; }
ExecutingState State { get; } Task

RunAsync(); void Load(IReadOnlyDictionary data); IReadOnlyDictionary Save(); }
Интерфейс RequestTaskpublic interface IRequestTask {  int Id { get; } Request Request { get; } ExecutingState

Слайд 39Интерфейс RequestTask
public interface IRequestTask { int Id { get; }
Request

Request { get; }
ExecutingState State { get; } Task

RunAsync(); void Load(IReadOnlyDictionary data); IReadOnlyDictionary Save(); }
Интерфейс RequestTaskpublic interface IRequestTask {  int Id { get; } Request Request { get; } ExecutingState

Слайд 40Приложение для организации событий
CreateEventRequest CreateEventRequestTask

AddPhotoRequest
CompressPhotoRequestTask
SendPhotoRequestTask
AddPhotoToEventRequestTask

AddParticipantRequest AddParticipantRequestTask

Приложение для организации событийCreateEventRequest	 CreateEventRequestTaskAddPhotoRequest							CompressPhotoRequestTask 					SendPhotoRequestTask					AddPhotoToEventRequestTaskAddParticipantRequest AddParticipantRequestTask

Слайд 41Очередь

Очередь

Слайд 42Очередь

Очередь

Слайд 43SerialRequestTask
public class SerialRequestTask : IRequestTask { private readonly IRequestTask _wrappedTask; private

readonly IRequestTask _dependingOnTask;

}

SerialRequestTaskpublic class SerialRequestTask : IRequestTask {  private readonly IRequestTask _wrappedTask;  private readonly IRequestTask _dependingOnTask; …}

Слайд 44SerialRequestTask
public class SerialRequestTask : IRequestTask { private readonly IRequestTask _wrappedTask; private

readonly IRequestTask _dependingOnTask;

}

SerialRequestTaskpublic class SerialRequestTask : IRequestTask {  private readonly IRequestTask _wrappedTask;  private readonly IRequestTask _dependingOnTask; …}

Слайд 45SerialRequestTask
public class SerialRequestTask : IRequestTask { private readonly IRequestTask _wrappedTask; private

readonly IRequestTask _dependingOnTask;

}

SerialRequestTaskpublic class SerialRequestTask : IRequestTask {  private readonly IRequestTask _wrappedTask;  private readonly IRequestTask _dependingOnTask; …}

Слайд 46Очередь

Очередь

Слайд 47Очередь

Очередь

Слайд 48Очередь

Очередь

Слайд 49Очередь

Очередь

Слайд 50Очередь

Очередь

Слайд 51Очередь

Очередь

Слайд 52Очередь

Очередь

Слайд 53Очередь

Очередь

Слайд 54Очередь

Очередь

Слайд 55Очередь

Очередь

Слайд 56Очередь

Очередь

Слайд 57Очередь

Очередь

Слайд 58Очередь

Очередь

Слайд 59Очередь

Очередь

Слайд 60Очередь

Очередь

Слайд 61Очередь

Очередь

Слайд 62Очередь

Очередь

Слайд 63Очередь

Очередь

Слайд 64Очередь

Очередь

Слайд 65Очередь

Очередь

Слайд 66Очередь

Очередь

Слайд 67Очередь

Очередь

Слайд 68Очередь

Очередь

Слайд 69Очередь

Очередь

Слайд 70Очередь

Очередь

Слайд 71Очередь

Очередь

Слайд 72Очередь

Очередь

Слайд 73Очередь

Очередь

Слайд 74Очередь

Очередь

Слайд 75Преимущества
Удобно разрабатывать
Гарантированная доставка
Просто визуализировать

ПреимуществаУдобно разрабатывать Гарантированная доставкаПросто визуализировать

Слайд 76Недостатки: сложно

Недостатки: сложно

Слайд 77Недостатки
Необходимость синхронизировать очередь
Сложный, витиеватый код

НедостаткиНеобходимость синхронизировать очередьСложный, витиеватый код

Слайд 78И ещё пара рецептов

И ещё пара рецептов

Слайд 79Взаимоисключение задач

Взаимоисключение задач

Слайд 80Взаимоисключение задач

Взаимоисключение задач

Слайд 81Взаимоисключение задач
public class AddParticipantRequest : Request { public int EventId {

get; } public int UserId { get; } public override

RequestConnectedType GetConnectedType(Request anotherRequest) => anotherRequest is RemoveParticipantRequest r && r.UserId == UserId ? RequestConnectedType.MutuallyExclusive : base.GetConnectedType(anotherRequest); }
Взаимоисключение задачpublic class AddParticipantRequest : Request {  public int EventId { get; }  public int

Слайд 82Взаимоисключение задач
public class AddParticipantRequest : Request { public int EventId {

get; } public int UserId { get; } public override

RequestConnectedType GetConnectedType(Request anotherRequest) => anotherRequest is RemoveParticipantRequest r && r.UserId == UserId ? RequestConnectedType.MutuallyExclusive : base.GetConnectedType(anotherRequest); }
Взаимоисключение задачpublic class AddParticipantRequest : Request {  public int EventId { get; }  public int

Слайд 83Взаимоисключение задач
public class AddParticipantRequest : Request { public int EventId {

get; } public int UserId { get; } public override

RequestConnectedType GetConnectedType(Request anotherRequest) => anotherRequest is RemoveParticipantRequest r && r.UserId == UserId ? RequestConnectedType.MutuallyExclusive : base.GetConnectedType(anotherRequest); }
Взаимоисключение задачpublic class AddParticipantRequest : Request {  public int EventId { get; }  public int

Слайд 84Взаимоисключение задач
public class AddParticipantRequest : Request { public int EventId {

get; } public int UserId { get; } public override

RequestConnectedType GetConnectedType(Request anotherRequest) => anotherRequest is RemoveParticipantRequest r && r.UserId == UserId ? RequestConnectedType.MutuallyExclusive : base.GetConnectedType(anotherRequest); }
Взаимоисключение задачpublic class AddParticipantRequest : Request {  public int EventId { get; }  public int

Слайд 85Взаимоисключение задач
public class AddParticipantRequest : Request { public int EventId {

get; } public int UserId { get; } public override

RequestConnectedType GetConnectedType(Request anotherRequest) => anotherRequest is RemoveParticipantRequest r && r.UserId == UserId ? RequestConnectedType.MutuallyExclusive : base.GetConnectedType(anotherRequest); }
Взаимоисключение задачpublic class AddParticipantRequest : Request {  public int EventId { get; }  public int

Слайд 86Взаимоисключение задач

Взаимоисключение задач

Слайд 87Взаимоисключение задач

Взаимоисключение задач

Слайд 88Дедупликация данных

Дедупликация данных

Слайд 89Дедупликация данных

Дедупликация данных

Слайд 90Дедупликация данных

Дедупликация данных

Слайд 91Дедупликация данных

Дедупликация данных

Слайд 92Дедупликация данных

Дедупликация данных

Слайд 93Дедупликация данных

Дедупликация данных

Слайд 94Дедупликация данных
RequestId

Дедупликация данныхRequestId

Слайд 95Дедупликация данных
RequestId
RequestId

Дедупликация данныхRequestIdRequestId

Слайд 96Итоги
Разбиваем задачи на атомарные подзадачи
Сохранение и восстановление данных и состояния
Связанные

задачи выполняем последовательно
Приоритеты задач
Взаимоисключение задач
Отправка RequestID на сервер и кэширование

результата запроса на сервере по этому RequestID
ИтогиРазбиваем задачи на атомарные подзадачиСохранение и восстановление данных и состоянияСвязанные задачи выполняем последовательноПриоритеты задачВзаимоисключение задачОтправка RequestID на

Слайд 97Спасибо

Спасибо

Обратная связь

Если не удалось найти и скачать доклад-презентацию, Вы можете заказать его на нашем сайте. Мы постараемся найти нужный Вам материал и отправим по электронной почте. Не стесняйтесь обращаться к нам, если у вас возникли вопросы или пожелания:

Email: Нажмите что бы посмотреть 

Что такое TheSlide.ru?

Это сайт презентации, докладов, проектов в PowerPoint. Здесь удобно  хранить и делиться своими презентациями с другими пользователями.


Для правообладателей

Яндекс.Метрика