博士:如果正确的软件设计模式是推拉管道模式的话,我希望你提供反馈。。
详细信息:假设我有几个软件算法/块来处理进入软件系统的数据:
[Download Data] --> [Pre Process Data] --> [ML Classification] --> [Post Results]下载数据块只需逗留到午夜新数据可用时,然后下载新数据。预处理数据只是徘徊,直到新下载的数据出现,然后预处理数据。机器学习(ML)分类块只是徘徊,直到有新的数据可以分类,等等。
整个系统似乎是事件驱动的,我认为完全符合推拉模式?
下载数据块将是一个生产者?使用者将是所有后续的块,除了绘图结果,哪个将是结果收集器?
Producer = pull
Consumer = pull then push
result collector = pull我在python框架内工作。这个实现看起来很理想:https://learning-0mq-with-pyzmq.readthedocs.io/en/latest/pyzmq/patterns/pushpull.html https://github.com/ashishrv/pyzmqnotes
如果我没有达到目标,我完全愿意使用另一种软件范型,而不是推拉。我也开放使用另一个回购,以及。
提前感谢您在上面的帮助!
发布于 2020-01-04 03:00:47
我已经做了很多次类似的管道,并且非常喜欢把它分成那样的块。为什么?主要用于从任何错误中自动恢复。如果有什么事情延迟了,它将在下个小时自动恢复。如果需要修复管道中间的一些东西,修复它并命名它,这样它就可以在下一个周期得到处理。(这一点以及较小的块更易于设计、构建和测试)。
例如,您的[Download Data]应该每小时运行一次以查找等待的数据:如果没有,请回去睡觉;如果有的话,将其下载到一个文件中,其中包含时间戳和状态:2020-0103T2153.downloaded.json。[Pre Process Data]应该每小时运行一次以查找名为*.downloaded.json的文件:如果没有,请回到睡眠状态;如果有一个或多个文件,则按增加时间戳顺序对每个文件进行预处理,并将其输出到<same-timestamp>.pre-processed.json。等等,为每一步。
这样做意味着意外事件可能会自动恢复,除非他们查看日志文件(您应该记录每个事件,以便知道发生了什么),否则没有人会知道。晚上很容易睡觉:)
在这些场景中,通过crontab驱动这一事件只是一天中的一天.当“醒来”时,管道中的每一步都只是看是否有任何工作在等待着它。尝试使文件创建事件启动事情是不简单的,特别是当您需要重新启动一些事情时(需要重新创建文件)。
我不会使用消息队列,因为当传入的消息到达时,它更复杂,更适合处理。您的情况是更简单的批处理文件处理,所以保持简单,晚上睡觉。
https://stackoverflow.com/questions/59587429
复制相似问题