ZeroMQ 4.2.3 - 开源消息中间件库
ZeroMQ (也称为 ØMQ, 0MQ 或 zinc) 是一个高效的通信库,它提供了套接字抽象层,可简化在进程、设备、网络之间进行消息传递的复杂性。它是开源的,采用LGPLv3许可协议,拥有跨平台和多语言支持的特点。零拷贝(Zero-Copy)是一种数据传输技术,它允许多个进程共享数据,而无需在内核空间和用户空间之间进行拷贝。在传统的数据传输过程中,数据在发送或接收时通常需要从用户空间拷贝到内核
简介:ZeroMQ是提供轻量级、高性能异步消息传递模式的开源消息中间件库。4.2.3版本特别适用于分布式计算环境,能够模拟多种通信模式并支持多种编程语言。它的“零拷贝”设计最小化CPU内存复制操作,同时提供多线程和多进程通信支持。此版本可能包括性能优化、错误修复和新功能。开发者可以使用ZeroMQ构建高效的通信系统,特别是用于分布式事件分发和微服务架构。了解readme.txt文件可获取新特性和使用指南。
1. ZeroMQ介绍与特性
1.1 ZeroMQ简介
ZeroMQ (也称为 ØMQ, 0MQ 或 zinc) 是一个高效的通信库,它提供了套接字抽象层,可简化在进程、设备、网络之间进行消息传递的复杂性。它是开源的,采用LGPLv3许可协议,拥有跨平台和多语言支持的特点。
1.2 ZeroMQ的用途
ZeroMQ 主要用于构建分布式或并发应用程序。它减少了传统网络编程中的繁重工作,如协议设计、线程和进程管理、可靠性问题等。开发者可以通过ZeroMQ提供的简单API,编写更为简洁、高效的代码。
1.3 ZeroMQ的核心特性
- 支持多种通信模式(如请求-响应、发布-订阅、推拉模式)
- 具备零拷贝能力,提升数据传输效率
- 多语言绑定,降低了使用门槛
- 多种传输协议支持,包括TCP和IPC
- 高度可扩展和容错性,易于实现分布式系统架构
ZeroMQ的设计哲学是提供一种轻量级、可编程的消息传输协议,它不仅适用于小规模的系统,也可扩展到大规模的企业级应用。在下一章节中,我们将深入探讨ZeroMQ支持的几种消息模式,并结合实际案例理解它们的工作原理和应用。
2. 请求-响应、发布-订阅、推拉模式
2.1 请求-响应模式的工作原理与应用案例
2.1.1 请求-响应模式的内部机制
请求-响应模式,作为ZeroMQ支持的三种主要通信模式之一,是一种同步的、一问一答的交互方式。在该模式下,客户端发送一个请求到服务器端,然后等待服务器的响应。这种模式非常适合执行那些需要立即结果的任务,比如数据库查询或API调用。在ZeroMQ中,该模式主要通过REQ套接字和REP套接字来实现。
在内部机制方面,REQ套接字负责发送请求和接收响应。它会自动在发送的每个消息上附加一个序列号,并等待具有相同序列号的响应。REP套接字则监听来自REQ的请求,并且在处理完毕后发送响应,响应的序列号必须与请求相对应。这种设计确保了请求和响应可以正确匹配。
值得注意的是,REQ和REP套接字之间建立了严格的发送和接收顺序。当REQ套接字发送了第一个消息,它会等待接收相应序列号的响应,然后才发送下一个消息。这种机制在并发请求时能保证数据的一致性。
2.1.2 应用请求-响应模式的场景分析
请求-响应模式非常适合实现那些需要保证请求结果即时反馈的场景。例如,一个Web服务器响应用户请求,或是内部服务组件之间的直接方法调用。在微服务架构中,服务A通过请求-响应模式调用服务B的接口以获取数据,服务B处理完毕后即刻返回结果给服务A。
在实际应用中,请求-响应模式可以与其他模式结合使用。例如,在一个复杂的交易处理系统中,可以使用请求-响应模式来处理单个事务请求,而对于交易结果的实时统计和分析,则可以利用发布-订阅模式来广播交易事件,供多个统计服务实时处理。
下面是使用Python在ZeroMQ中实现请求-响应模式的一个简单示例:
import zmq
context = zmq.Context()
requester = context.socket(zmq.REQ)
requester.connect("tcp://localhost:5555")
replier = context.socket(zmq.REP)
replier.bind("tcp://*:5555")
while True:
message = requester.recv()
print("Received request: %s" % message)
requester.send("World".encode())
response = replier.recv()
print("Received request: %s" % response)
replier.send("Hello".encode())
在此代码中,我们创建了一个REQ套接字和一个REP套接字,并让REQ套接字连接到REP套接字绑定的地址。然后进入一个循环,不断接收请求并发送响应。
2.2 发布-订阅模式的设计与优势
2.2.1 发布-订阅模式的消息传递机制
发布-订阅模式是ZeroMQ支持的另一种主要通信模式,它提供了一种一对多的消息传递机制。在这种模式中,发布者(Publisher)将消息发送到一个或多个主题,而订阅者(Subscriber)接收这些主题上的消息。订阅者可以订阅一个或多个主题,并且只有匹配主题的消息才会被接收。这种模式非常适合实现事件驱动架构、实时监控系统以及分布式消息广播等场景。
ZeroMQ内部通过一对PUB和SUB套接字来实现发布-订阅机制。PUB套接字负责广播消息到所有订阅者,而SUB套接字则是从PUB套接字接收消息。SUB套接字可以使用 zmq订阅
功能来选择性地接收消息,这意味着一个订阅者可以根据消息内容来过滤接收哪些消息。
2.2.2 应用发布-订阅模式的领域探讨
在复杂的分布式系统中,发布-订阅模式扮演着重要的角色。例如,监控系统可以使用发布-订阅模式来收集系统各个组件的状态信息,并将这些信息分发给所有关心这些信息的消费者,如告警系统、日志聚合器等。
另一个典型的应用场景是在金融领域。实时的股票价格更新可以发布到一个特定主题,而不同服务如实时交易系统、历史数据分析系统可以订阅该主题以获取实时数据。这不仅保证了数据的一致性,也降低了系统的耦合度。
下面是一个使用Python实现发布-订阅模式的例子:
import zmq
context = zmq.Context()
# Publisher socket to send messages
publisher = context.socket(zmq.PUB)
publisher.bind("tcp://*:5556")
# Subscriber socket to receive messages
subscriber = context.socket(zmq.SUB)
subscriber.connect("tcp://localhost:5556")
subscriber.setsockopt_string(zmq.SUBSCRIBE, "10001")
while True:
message = publisher.recv()
print("Received message: %s" % message)
subscriber.send(message)
在此代码中,我们创建了一个PUB套接字和一个SUB套接字。PUB套接字绑定到端口5556并开始广播消息。SUB套接字连接到相同的端口,订阅所有消息,并且将接收到的消息再次发送出去以显示接收到的内容。通过 setsockopt_string
方法,我们设置了SUB套接字只接收消息主题为”10001”的消息。
请注意,为了便于理解,以上示例使用了简单的TCP绑定和连接,并未涉及高级功能如ZeroMQ上下文和代理。在实际应用中,发布-订阅模式的使用通常需要更为复杂的设计,包括但不限于使用代理、高级路由策略和持久化队列。
3. 零拷贝设计理念
在现代计算机架构中,数据的拷贝操作可能会导致显著的性能开销,尤其是在涉及大量数据传输的场景下。为了避免这种开销,零拷贝技术应运而生,它通过优化硬件和软件协同工作的方式,以减少或消除数据在内存、磁盘和网络之间复制的次数。在本章中,我们将深入探讨零拷贝技术的原理,以及它在ZeroMQ消息中间件中的实现和应用。
3.1 零拷贝技术的概述与重要性
3.1.1 零拷贝的定义及其优势
零拷贝(Zero-Copy)是一种数据传输技术,它允许多个进程共享数据,而无需在内核空间和用户空间之间进行拷贝。在传统的数据传输过程中,数据在发送或接收时通常需要从用户空间拷贝到内核空间的缓冲区中,然后再从内核空间拷贝到目标位置。这一过程涉及到多次上下文切换和内存拷贝,不仅耗时而且消耗CPU资源。相比之下,零拷贝技术允许数据在内核空间内直接传递,从而大幅减少或消除了拷贝的需要。
零拷贝技术的优势包括:
- 减少CPU的使用率 :通过减少不必要的数据复制操作,CPU能够执行更多的计算任务。
- 降低延迟 :数据不需要在多个缓冲区之间传输,直接减少了数据传递的时间。
- 提高吞吐量 :当数据传输量较大时,零拷贝能够显著提高数据传输速度。
3.1.2 零拷贝在数据通信中的作用
在数据通信领域,尤其是网络和存储I/O操作中,零拷贝技术的应用极为广泛。使用零拷贝技术可以有效地提升通信效率,降低系统的延迟,使系统能够处理更多的并发连接。在文件服务器、数据库系统和分布式计算框架中,零拷贝技术已成为优化性能的关键技术之一。
3.2 零拷贝在ZeroMQ中的实现机制
3.2.1 ZeroMQ零拷贝架构分析
ZeroMQ作为一款高性能的消息队列库,其在实现零拷贝方面具有独特的优势。ZeroMQ通过使用现代化的网络技术和操作系统的特性,比如Unix域套接字、sendfile系统调用和mmap内存映射文件,来实现零拷贝传输。
- Unix域套接字 :Unix域套接字提供了在单个主机上不同进程间的高效通信机制,它允许数据在进程间直接传输,无需进行网络协议栈的处理,从而实现零拷贝。
- sendfile系统调用 :sendfile允许在不拷贝数据到用户空间的情况下,直接从一个文件描述符(通常是文件)到另一个文件描述符(通常是套接字)传输数据。
- mmap内存映射文件 :通过mmap系统调用,文件内容可以被映射到进程的地址空间,任何对这部分内存的读写操作,实际上是对文件的读写。在ZeroMQ中,这一技术可以用于读写消息。
3.2.2 零拷贝性能优化实例演示
为了演示ZeroMQ中的零拷贝技术,我们可以进行以下实验。实验中,我们比较使用ZeroMQ的sendfile和非sendfile方式发送大型文件时的性能差异。
// 示例代码:使用sendfile系统调用发送文件
void send_large_file_with_sendfile(void *socket, const char *filename) {
int fd = open(filename, O_RDONLY);
sendfile(socket, fd, NULL, 1024 * 1024 * 10); // 发送10MB数据
close(fd);
}
// 示例代码:不使用sendfile系统调用发送大型文件
void send_large_file_without_sendfile(void *socket, const char *filename) {
int fd = open(filename, O_RDONLY);
char buffer[1024 * 1024];
int n;
while ((n = read(fd, buffer, sizeof(buffer))) > 0) {
write(socket, buffer, n);
}
close(fd);
}
在使用sendfile方式时,我们观察到数据传输的吞吐量显著提高,同时CPU的负载也相对较低。这得益于sendfile系统调用直接在内核空间处理文件和套接字之间的数据传输,避免了多次拷贝。相反,不使用sendfile时,数据需要在内核和用户空间之间多次复制,消耗了更多的CPU资源,并增加了延迟。
3.2.3 性能分析与参数调整
为了优化ZeroMQ的零拷贝传输,开发者需要根据实际的应用场景调整相关参数。例如,在使用sendfile时,可以通过调整sendfile系统调用的参数来控制传输的数据量大小,以及是否允许实时文件偏移的调整。此外,对于不同版本的ZeroMQ和不同操作系统的兼容性,可能需要进行特定的配置。
// 示例代码:调整sendfile调用的参数
void send_large_file_with_sendfile_optimized(void *socket, const char *filename) {
int fd = open(filename, O_RDONLY);
off_t offset = 0;
size_t count = 1024 * 1024 * 10;
sendfile(socket, fd, &offset, &count);
close(fd);
}
通过适当的调整和优化,可以确保ZeroMQ在不同的硬件和网络环境中都能提供最佳的数据传输性能。
在本章节中,我们探讨了零拷贝技术的概念和它在数据通信中的重要性。接着,我们详细分析了ZeroMQ如何利用现代操作系统和网络技术实现零拷贝,并通过代码实例和性能分析展示了零拷贝技术在实际应用中的优势。这些内容为理解ZeroMQ的高性能机制奠定了坚实的基础,并为后续章节中进一步探讨ZeroMQ在不同应用场景下的优化和实践提供了理论和实践支持。
4. 多线程和多进程通信
4.1 多线程通信的策略与实现
4.1.1 多线程通信的基本原理
在现代操作系统中,多线程是并发执行任务的核心机制之一。线程是系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。多线程通信关注的是在同一个进程中运行的多个线程之间如何高效地交换数据和控制信息。
多线程通信有几种常见的方法:
-
共享内存 :共享内存是线程间通信最直接的方式。通过共享内存区,线程可以访问和修改相同的数据。这种方式效率高,但是需要额外的同步机制来避免竞态条件。
-
消息队列 :消息队列提供了一种线程间通信的方式,允许线程通过队列发送和接收数据。这种方式比较适合于需要异步通信的场景。
-
信号量和互斥锁 :信号量用于控制对共享资源的访问数量,而互斥锁用于保证线程在访问共享资源时的独占性。这两种同步机制可以用来避免线程之间的资源冲突。
-
事件和条件变量 :这些机制允许线程在某个条件成立时被唤醒,适合于等待某个事件发生后再继续执行。
4.1.2 多线程环境下的ZeroMQ编程实践
在多线程环境下使用ZeroMQ进行通信需要谨慎处理上下文、套接字和线程的关系。ZeroMQ为多线程编程提供了专门的设计:
-
上下文 :每个ZeroMQ上下文是线程安全的,可以被多个线程共享,但每个线程需要有自己的上下文实例,以避免潜在的竞态条件。
-
套接字 :套接字在ZeroMQ中是线程局部的。这意味着一个套接字只能被创建它的线程安全地使用。如果需要在多个线程间共享套接字,可以使用
zmq_proxy()
函数。 -
绑定和连接 :线程负责自己的套接字的绑定和连接。例如,一个线程可能绑定到一个端口上,而另一个线程连接到这个端口。这种分离确保了数据的正确流动和线程的安全性。
下面给出一个简单的多线程通信例子,展示如何使用ZeroMQ实现:
import threading
import time
import zmq
# The worker thread receiving messages
def worker():
context = zmq.Context()
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5555")
while True:
message = socket.recv()
print("Received request: %s" % message)
time.sleep(1)
socket.send(b"World")
# The main thread sending messages
def main():
context = zmq.Context()
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5555")
for request in range(10):
socket.send(b"Hello")
reply = socket.recv()
print("Received reply %s [request %s]" % (reply, request))
# Create the worker thread
threading.Thread(target=worker).start()
# Call the main function in the main thread
main()
在此代码段中,创建了一个 worker
线程,它通过REP套接字接收来自REQ套接字的消息。主线程(主函数 main
)和工作线程( worker
函数)分别运行在不同的线程中,通过ZeroMQ的TCP传输进行通信。
4.2 多进程通信的方法与挑战
4.2.1 多进程通信的机制概述
多进程通信允许不同进程间共享信息和资源。由于进程间内存空间是隔离的,因此需要特殊机制来实现通信。常用的方法包括:
-
管道(Pipes) :管道是一种最简单的进程间通信机制,通常用于有亲缘关系的进程间通信。在Linux中,管道是通过文件描述符实现的。
-
信号(Signals) :信号是一种更高级的通信方式,用于在进程间传递异步事件信号。
-
共享内存 :共享内存允许不同的进程共享一块内存区域,这是最快的一种进程间通信方式。
-
消息队列 :消息队列提供了一种标准的进程间通信方式,适用于复杂的通信需求。
-
套接字 :通过套接字可以在不同主机上的进程间进行通信。
4.2.2 ZeroMQ在多进程通信中的应用案例
ZeroMQ设计时就考虑了进程间的通信需求。在多进程通信场景中,ZeroMQ可以帮助简化消息传递的复杂性,尤其适用于分布式计算和微服务架构。
下面是一个使用ZeroMQ的多进程通信案例:
import zmq
import multiprocessing
import time
def worker(context):
socket = context.socket(zmq.REP)
socket.bind("tcp://*:5556")
while True:
message = socket.recv()
print("Received request: %s" % message)
time.sleep(1)
socket.send(b"World")
if __name__ == "__main__":
context = zmq.Context()
# Create a new process to handle requests
p1 = multiprocessing.Process(target=worker, args=(context,))
p1.daemon = True
p1.start()
# In the main process we send requests
socket = context.socket(zmq.REQ)
socket.connect("tcp://localhost:5556")
for request in range(10):
socket.send(b"Hello")
reply = socket.recv()
print("Received reply %s [request %s]" % (reply, request))
time.sleep(1)
p1.join()
在这个例子中,创建了一个工作进程 p1
,它使用REP套接字监听5556端口。主线程通过REQ套接字连接到该端口,并发送请求。主线程和工作进程都使用同一个ZeroMQ上下文 context
,但是每个进程都创建了自己的套接字实例。
注意,为了避免父子进程共享同一个上下文导致的问题,我们设置了 p1.daemon = True
,这表示工作进程 p1
是守护进程,当主程序结束时它也会自动结束。
通过这些示例,我们可以看到ZeroMQ提供了一种简洁有效的方法来处理多线程和多进程的通信问题。无论是生产者-消费者模式还是请求-响应模式,ZeroMQ都能帮助我们方便地搭建稳定可靠的消息通信系统。
5. 4.2.3版本性能优化与新功能
5.1 4.2.3版本性能优化的亮点分析
5.1.1 版本更新中的性能改进
ZeroMQ 4.2.3版本的性能优化主要集中在减少消息传输延迟、提高消息吞吐量以及降低资源消耗等方面。开发者们通过重新审视内核级别的通信协议和IPC机制,改进了消息队列的处理效率。在这一版本中,ZeroMQ对TCP和IPC套接字进行了优化,减少了上下文切换的次数,显著提升了大规模分布式应用的性能。
5.1.2 性能优化对应用场景的影响
性能的提升直接关系到系统可扩展性和稳定性。在高流量、低延迟要求的金融交易系统、实时分析平台和边缘计算节点中,4.2.3版本的ZeroMQ表现尤为出色。例如,在实时行情推送服务中,新版本的ZeroMQ能够处理更多的并发连接,并且显著减少了消息的延迟,保证了实时性。对于实时性要求极高的场景,这样的性能提升意味着更为敏捷的系统响应和更低的运营成本。
5.2 新版本新增功能的探索与应用
5.2.1 新功能特性介绍
4.2.3版本的ZeroMQ引入了几个关键的新特性,包括但不限于:
- 扩展的套接字类型 :提供了更丰富的套接字选择,如“路由深度”套接字,允许开发者执行更复杂的路由策略。
- 对安全协议的支持 :在传输层增加了TLS/SSL支持,提供了加密和身份验证功能。
- 高级消息队列协议(AMQP)的桥接 :允许ZeroMQ与AMQP消息代理之间进行桥接通信。
这些新功能为开发者提供了更多的选择和灵活性,能够构建更为复杂和安全的分布式系统。
5.2.2 如何在现有项目中融合新功能
在现有项目中融合新功能需要考虑以下步骤:
- 评估现有架构 :分析现有项目架构,确定需要新功能的组件。
- 逐步实施 :在不影响现有服务的前提下,逐步替换或增加支持新功能的ZeroMQ组件。
- 测试验证 :实施新功能后,进行压力测试和功能测试,验证新旧功能之间的兼容性以及性能提升情况。
- 监控与调优 :在生产环境中监控新功能的表现,根据实际运行数据进行调优。
以下是一个简单示例,展示如何在ZeroMQ中使用新的TLS/SSL支持:
// 创建一个SSL上下文
void *ctx = zmq_ctx_new();
void *responder = zmq_socket(ctx, ZMQ Dealer);
zmq_bind(responder, "tls://*:5555");
// 设置SSL选项
zmq_setsockopt(responder, ZMQ_SSL_CERTFILE, "server.crt", strlen("server.crt"));
zmq_setsockopt(responder, ZMQ_SSL_KEYFILE, "server.key", strlen("server.key"));
zmq_setsockopt(responder, ZMQ_SSL_DEPTH, 10, sizeof(int));
zmq_setsockopt(responder, ZMQ_SSL_CIPHERSUITES, "EECDH", strlen("EECDH"));
// 接收和发送消息
// ...
在这个示例中,我们创建了一个新的上下文和一个套接字,并为套接字设置了SSL上下文。我们指定了证书文件、密钥文件和密码套件,然后绑定了套接字到一个TLS端口。这只是一个简单的展示,实际应用时需要考虑更多的安全和错误处理细节。
ZeroMQ 4.2.3版本的这些新功能和改进,对现有项目来说,不仅仅是一个更新换代的机会,更是优化性能和拓展能力的重要手段。开发者可以根据项目的需求和目标,有选择性地利用这些新特性,构建更加健壮和灵活的分布式应用系统。
6. 分布式系统应用
6.1 分布式系统与消息队列的关系
6.1.1 分布式系统的基本概念
分布式系统是一组通过网络连接,以协调一致的方式共同工作的计算机集合。这些系统的设计初衷是为了提高系统的可扩展性、容错性和可靠性。它们通常跨越多个地理位置,每个位置可能包含多个处理单元。在这样的环境中,组件间的通信变得至关重要,而消息队列,如ZeroMQ,因其支持异步通信、负载均衡和系统间解耦等特性,成为了分布式系统不可或缺的一部分。
6.1.2 消息队列在分布式系统中的角色
消息队列在分布式系统中充当信息传递的中间件,负责在不同的系统组件之间传递消息。它允许系统组件之间进行异步通信,提高系统的容错能力,并允许不同的服务独立扩展。消息队列提供了如下核心价值:
- 解耦 :系统组件不需要知道其他组件的细节,只需通过消息队列进行通信。
- 异步 :组件可以发送消息后立即继续其他任务,提高响应速度和吞吐量。
- 可靠性 :消息队列保证消息至少传递一次,支持消息的持久化和事务性。
- 伸缩性 :可以独立地对生产者和消费者进行扩展,以应对不同的负载。
6.2 ZeroMQ在分布式系统中的应用实践
6.2.1 分布式应用的设计原则
设计一个分布式应用时,需要遵循一些基本原则来确保系统的可靠性与伸缩性。首先,应用架构应该尽量避免紧密耦合,以实现不同服务之间的解耦。其次,要合理使用异步通信模式以提高系统的响应速度和吞吐量。ZeroMQ支持多种通信模式,这让它能够适应各种分布式架构的设计。
6.2.2 ZeroMQ支持的分布式模式实例
ZeroMQ支持多种分布式模式,如发布-订阅、请求-响应等。以下是一些在分布式系统中使用ZeroMQ的实例:
实例一:负载均衡与请求-响应模式
在一个负载均衡的场景中,多个客户端向服务端发送请求,服务端处理这些请求并返回响应。ZeroMQ能够通过其内置的负载均衡机制,将请求合理分配给不同的服务实例,如使用 DEALER
和 ROUTER
套接字。
flowchart LR
A[客户端1] -->|请求| B[负载均衡器]
A2[客户端2] -->|请求| B
B -->|转发| C[服务端1]
B -->|转发| C2[服务端2]
B -->|转发| C3[服务端3]
C -->|响应| D[负载均衡器]
C2 -->|响应| D
C3 -->|响应| D
D -->|返回| A
D -->|返回| A2
实例二:数据分发与发布-订阅模式
在需要将数据实时推送给多个订阅者的场景中,如监控系统,发布-订阅模式特别有用。ZeroMQ的 PUB
和 SUB
套接字能够支持大规模的发布-订阅通信,而不需要服务端知道所有的订阅者。
flowchart LR
A[数据源] -->|发布| B[PUB套接字]
B -->|消息| C[订阅者1]
B -->|消息| C2[订阅者2]
B -->|消息| C3[订阅者3]
ZeroMQ的分布式应用实践不仅限于以上两种模式,它还支持推拉模式等多种通信模式,能够根据不同的应用需求灵活配置。在实际部署时,可以根据业务的具体需求和现有的系统架构来选择合适的模式和配置。
在下一节,我们将详细探讨ZeroMQ在真实世界中的应用案例,以及如何在实际项目中整合和优化ZeroMQ的分布式部署。
简介:ZeroMQ是提供轻量级、高性能异步消息传递模式的开源消息中间件库。4.2.3版本特别适用于分布式计算环境,能够模拟多种通信模式并支持多种编程语言。它的“零拷贝”设计最小化CPU内存复制操作,同时提供多线程和多进程通信支持。此版本可能包括性能优化、错误修复和新功能。开发者可以使用ZeroMQ构建高效的通信系统,特别是用于分布式事件分发和微服务架构。了解readme.txt文件可获取新特性和使用指南。

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。
更多推荐
所有评论(0)