Страница 2 из 2

Re: Domain events и websocket

Добавлено: 2016.12.08, 01:32
sda
А в билдере в таком случае тоже отдельный метод делать, который будет вызывать отдельный метод сущности для восстановления из базы?

Re: Domain events и websocket

Добавлено: 2016.12.08, 01:42
zelenin
sda писал(а):А в билдере в таком случае тоже отдельный метод делать, который будет вызывать отдельный метод сущности для восстановления из базы?
в каком билдере?

Re: Domain events и websocket

Добавлено: 2016.12.08, 12:34
sda
zelenin писал(а):
sda писал(а):А в билдере в таком случае тоже отдельный метод делать, который будет вызывать отдельный метод сущности для восстановления из базы?
в каком билдере?
http://stackoverflow.com/a/40324/2868530

Re: Domain events и websocket

Добавлено: 2017.05.15, 00:54
sda
ElisDN писал(а): 2016.12.01, 19:52
sda писал(а):как сделать, чтобы domain events выбрасывались после сохранения агрегата?
Через $this->recordEvent(new Event(...)) в агрегате и $aggregate->releaseEvents() после сохранения.
а у Вернона читали решение? Там события выбрасываются сразу. Их ловит подписчик и отправляет в базу. Они консистентно сохраняются вместе с агрегатом, т.к. application сервис выполняет всё внутри транзакции. Потом кто-то читает базу и скидывает новые события в rabbitMQ. Без необходимости загрязнять агрегат $this->recordEvent/releaseEvents.

Re: Domain events и websocket

Добавлено: 2017.05.15, 12:04
anton_z
Классное решение, сам к нему пришел, потом уже прочитал. Юзаю для обработки картинок и гетерогенной репликации

Re: Domain events и websocket

Добавлено: 2017.05.15, 15:05
sda
В книге вот такая реализация на Java (опустил код методов).

Код: Выделить всё

public class DomainEventPublisher {
	@SuppressWarnings("unchecked")
	private static final ThreadLocal<List> subscribers = new ThreadLocal<List>();
	private static final ThreadLocal<Boolean> publishing = new ThreadLocal<Boolean>() {
		protected Boolean initialValue() {
			return Boolean.FALSE;
		}
	};
	public static DomainEventPublisher instance() {
		return new DomainEventPublisher();
	}
	public DomainEventPublisher() {
		super();
	}
	@SuppressWarnings("unchecked")
	public <T> void publish(final T aDomainEvent) {
		...
	}
	public DomainEventPublisher reset() {
		...
	}
	@SuppressWarnings("unchecked")
	public <T> void subscribe(DomainEventSubscriber<T> aSubscriber) {
		...
	}
}
Дальше он пишет, что все запросы выполняются в тредах и т.к. свойство subscribers является статическим, то оно будет делить область видимости между тредами. Чтобы этого не происходило он использует ThreadLocal. Это фича джавы позволяет под каждый тред создать отдельное статическое свойство.

В php такой проблемы нет, так как код выполняется не в тредах, а в отдельных процессах и выполняется синхронно. Но я пишу под node.js. Тут тоже код выполняется в отдельном процессе, но асинхронно. Пока один запрос ждет I/O, процесс начинает обрабатывать следующий. И соответственно возникает похожая проблема как с тредами в Java. Статическое свойство subscribers начинает делить область видимости между разными запросами и всё это решение ломается. Из коробки в node нет чего-то типа ThreadLocal из мира Java. Есть библиотека https://github.com/othiym23/node-contin ... al-storage с помощью которой насколько я понимаю можно решить эту проблему. Но она пролезет внутрь класса DomainEventPublisher, который является частью домена и в application сервисы где я буду подписываться на доменные события. Это всё не очень хорошо.

Не знаю что делать. Без статики это решение из книги вроде не сделать.

Re: Domain events и websocket

Добавлено: 2017.05.15, 15:17
zelenin
в go мы решаем эти проблемы мьютексами - гугл выдает либы для ноды.
https://www.google.ru/search?client=ubu ... tAH8opioBg

Re: Domain events и websocket

Добавлено: 2017.05.18, 15:53
sda
С мьютексами как-то сложно. Что если забить на то, что subscribers делит область видимости, но не добавлять нового подписчика, если такой уже есть. При первом вызове application сервиса, подписчик будет создан и добавлен, при следующих вызовах просто ничего не будет происходить т.к. такой подписчик уже есть. Теоретически должно получиться, что после первого вызова application сервиса единственный экземпляр всегда висит в памяти. Как думаете, какие будут проблемы ?

Re: Domain events и websocket

Добавлено: 2017.05.18, 16:00
zelenin
sda писал(а): 2017.05.18, 15:53 С мьютексами как-то сложно.
например? в го магически двумя строчками
sda писал(а): 2017.05.18, 15:53Что если забить на то, что subscribers делит область видимости, но не добавлять нового подписчика, если такой уже есть. При первом вызове application сервиса, подписчик будет создан и добавлен, при следующих вызовах просто ничего не будет происходить т.к. такой подписчик уже есть. Теоретически должно получиться, что после первого вызова application сервиса единственный экземпляр всегда висит в памяти. Как думаете, какие будут проблемы ?
проблемы в том, что вы не хотите сразу научиться решать проблемы шаред доступа к памяти на примере одного кейса, хотя вас ждет такое еще не единожды - лучше заранее выбработать паттерн.