Node.js中的自定义事件编程:I / O绑定的面向事件的设计模式?

问题描述

我正在node.js中开发工厂自动化软件(图腾车门)。

程序可以管理很多“任务”,例如,它必须:

  • 监视和控制一些I / O数字信号
  • 管理来自外部主机的消息,例如通过TCP套接字消息
  • 通过HTTP REST轮询其他设备(我需要将轮询转换为事件)
  • 通过键盘(和屏幕终端/语音输出)与用户交互
  • 在外部服务器上查询关系数据库

通常,node.js是管理(I / O)事件的理想环境,我知道我可以使用EventEmitter生成自定义事件的事实。

对于以上所有详细的任务,请假设:

  • 任何任务都可以以异步方式(HTTP / TCP /键盘)进行管理,
  • 我能够在Node.js单线程(1个cpu内核)中管理以上所有“任务”

因此,我可以将主程序设计为事件驱动的,将应用程序逻辑实现为SW事件(Node.js习惯事件)的回调,并将它们与I / O(HW)事件映射。

下面是一个代码

// -----------------------------
// module A: keyboard management
// -----------------------------

// when user enter 5 digits (code) on the keypad keystroke (code omitted),// emit the SW event 'digitsEntered'

keyBoardDialog.emit('digitsEntered',code)

// ----------------------------------------
// module B: I/O digital signals management
// ----------------------------------------

// poll (every ~300 msecs) through HTTP GET 
// to get a buffer containing all digital input bits
// and when the digital input 1 goes ON,emit SW event,'DI1ON' (code omitted)

digitalInputs.emit('DI1ON')


// -----------
// main module
// -----------

// all events handler
keyBoardDialog.on ('digitsEntered',(code) => doActionWithDigits(code) )
digitalInputs.on ('DI1ON',doAnotherAction() )

function doActionWithDigits(code) {
  writeOnDatabase(code) // asynch
  writeDigitalOutput(4) // HTTP GET = asynch
  // any other synch or asynch function
}

自定义事件回调(处理程序)可能包含顺序和/或异步(异步)功能

通过示例,我们重点研究从键盘读取按键的任务。 用户必须输入5位数字,并且键盘模块逻辑会触发自定义事件('digitsEntered')。

doActionWithDigits()处理程序包含异步函数。 这里可能会出现计时/数据共享问题。

因为基于事件的单线程体系结构,所以我必须在自定义e事件处理程序中管理“无中断”逻辑。为了避免数据读/写重叠。为了避免在运行等事件时再次触发该自定义事件,等等。

在我看来,我正面临着经典的多线程管理噩梦。

我的问题:

  • 关于如何在类似情况下管理自定义事件处理程序,有什么好的做法/指南?
  • 使用自定义事件而不是Node.js回调的真正优势是什么? 全部都是去耦逻辑吗?
  • 您是否可以提出一些有关设计模式良好实践的文章(书/书)?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)