软件体系结构复习
SOA复习大纲
SOA技术简述
为什么要引入SOA、SOA要解决的问题
为什么要引入SOA:需求拉动、技术推动
- Internet环境下的企业交互:现代企业已经不再是封闭的企业,市场分工的日益专业化使得企业之间可能存在大量频繁的交互行为,以发挥各自的竞争优势。这种业务上的交互体现为企业业务流程的交互/互操作,同时一定需要企业信息系统的支持,因此体现为软件系统之间的集成与互操作
- 异构系统的集成与互操作:技术平台不同、软件体系结构不同、数据格式不同
- 频繁变化的互操作与集成需求:企业的业务是频繁变化的,IT应用系统要能够快速支持这种变化的需求,需要迅速、敏捷、高效的调整业务应用系统
SOA要解决的问题:
- 分布式企业间业务的协同
- 通过Internet连接在一起的异构企业应用软件系统的集成、交互与互操作
- 当业务(Business)发生变化时,IT系统能够快速响应
软件测试复习
前端实习面试问题准备
问题
Node.js 单线程如何保证线程不中断?
Node.js 被广泛认为是单线程的,但这个说法需要更准确的解释。Node.js 的主执行线程是单线程的,它运行在 V8 JavaScript 引擎上。然而,Node.js 使用多线程来处理 I/O 密集型任务,这是通过其底层的 libuv 库实现的。以下是 Node.js 保证其单线程不中断的几个关键方面:
异步非阻塞 I/O:
- Node.js 主要依靠事件循环和回调函数来处理 I/O 操作(如文件读写、网络请求等),这些操作是异步和非阻塞的。
- 当一个 I/O 操作开始时,它会被发送到事件循环,并继续执行后续的代码,而不是等待 I/O 操作完成。当 I/O 操作完成时,相应的回调函数会被放入事件队列中,等待主线程空闲时执行。
事件驱动架构:
- Node.js 使用事件驱动模型来处理各种异步操作。每当有事件发生时(如数据到达、超时、处理完成),相应的回调函数会被触发。
- 这种模型使得 Node.js 能够在不被阻塞的情况下高效地处理大量的并发请求。
libuv 库:
- 尽管 JavaScript 代码在单个主线程上运行,Node.js 使用 libuv 库在背后管理一个线程池。
- 对于一些复杂的操作(如文件系统操作、某些加密操作),libuv 会在后台的多个线程上执行这些任务,而主线程继续执行 JavaScript 代码。
错误处理机制:
- Node.js 提供了异常处理机制,比如
try-catch
块和全局的uncaughtException
事件,来处理同步和异步代码中的错误。 - 正确的错误处理能够防止异常导致主线程崩溃。
- Node.js 提供了异常处理机制,比如
进程管理:
- 对于 CPU 密集型任务,可以使用 Node.js 的
child_process
模块来创建子进程,分担主线程的负载。 - 还可以使用集群(Cluster)模块来创建多个进程,每个进程都有自己的事件循环和 V8 实例,可以更好地利用多核 CPU。
- 对于 CPU 密集型任务,可以使用 Node.js 的
通过这些机制,Node.js 能够确保即使是在单个主线程上运行,也能高效地处理大量的并发 I/O 操作,同时避免线程中断和阻塞。