Форум сайта python.su
2
Значит есть БД сайта, нужно логировать изменения в некоторых столбцах, это реализовано через триггер, который пишет в таблицу, тип уведомления(через что отсылать), текст уведомления, и адрес куда слать, телефонный номер\email и.т.п, программу которая будет вытаскивать из БД уведомления и будет их слать решил написать на python.
Вот и вопросы начали возникать.
Как я хочу это реализовать:
Абстрактный класс BaseReader от которого будет унаследован класс читающий данный с БД\или оттуда где будут хранится уведомления.
Абстрактный класс Notifer который в конструкторе будет принимать очередь Queue и его потомки должны будут реализовать отсылку уведомлений.
Ну и класс главного потока пусть Main который будет брать данные через заданный интервал времени через DataReader, ложить их в очередь, и ждать пока все уведомления будут отосланы.
Первый вопрос как потом удалять отосланные данные из БД, кто в этой системе должен заниматься?
И вообще как такое получше сделать?
Вот класс для чтения BaseReader.
По сути я сейчас думаю как бы грамотно реализовать все. Чтобы в дальнейшем новые системы уведомлений подключать.
class BaseReader(object): __metaclass__ = ABCMeta @abstractmethod def getItems(self, count): """ Наследники должны реализоовать этот метод который должен возвращать список обьектов Notify """
Офлайн
33
Это асинхронная задача, если извещений немного, можно делать как вы написали.
Если много и нужен прицел на будущее, решать ее нужно через celery, например.
Офлайн
33
Если извещений мало, то можно еще проще: 1 класс берет данные из БД, формирует извещение и отправляет его, записывает в БД результат, берет след. запись и т.д.
Офлайн
2
LexanderНу на данный момент, хотелось бы реализовать как я написал. Опыта с библиотекой которую вы предложили я не имею, а если возрастет нагрузка то можно будет переписать, хотелось бы знать в каком классе должно быть удаления из БД уведомлений которые успешно отосланы?
Это асинхронная задача, если извещений немного, можно делать как вы написали.Если много и нужен прицел на будущее, решать ее нужно через celery, например.
Офлайн
33
Если хотите выделить классические роли, нужен 3 класс - DataWriter.
Еще нужна очередь выполненных заданий.
После обработки задания Notifer извещает о выполнении Main, который добавляет во 2 очередь задание записать DataWriter-у.
Main выполняет все функции диспетчеризации.
Для нынешней сложности приложения схема правильная с точки зрения архитектуры: Main-диспетчер, DataReader, DataWriter, Notifier.
Конечно, она избыточна, но зато красива.
2 вариант.
Учитывая то, что обе очереди могут быть глобальными объектами, то Main может просто запускать работу остальных классов, создавать очереди, но не заниматься непосредственно обслуживанием очередей.
DataReader читает из БД задания и сразу помещает их в очередь на отправку.
Notifier выполняет работу и помещает результат в очередь результатов.
DataWriter читает очередь результатов и записывает результат в базу.
Это тоже архитектурно правильный вариант.
Причем, это вариант с заделом на будущее, когда у Main может появиться другая работа и объем кода вырастет.
Офлайн