Skip to content

高性能无服务器事件和数据处理平台

License

Notifications You must be signed in to change notification settings

yuanzhongqiao/nuclio-cn

This branch is 1 commit ahead of, 282 commits behind nuclio/nuclio:development.

Folders and files

NameName
Last commit message
Last commit date

Latest commit

ce78342 · Jan 19, 2024
Dec 20, 2023
Dec 7, 2022
Jan 17, 2024
Jan 18, 2024
Jan 9, 2024
Jan 18, 2024
Jan 18, 2024
Apr 25, 2023
Nov 30, 2023
Jan 10, 2024
Aug 25, 2022
Nov 22, 2023
Jun 25, 2023
Jun 4, 2017
Jan 10, 2024
Jan 19, 2024
Nov 22, 2023
Jun 25, 2023
Jan 18, 2024
Jan 18, 2024

Repository files navigation

定期 文件状态 去报告卡 松弛 神器中心 伊瓜齐奥职业生涯

努克利奥

Nuclio - 用于实时事件和数据处理的“无服务器”框架

在本文档中

翻译:

概述

Nuclio 是一个高性能“无服务器”框架,专注于数据、I/O 和计算密集型工作负载。它与流行的数据科学工具很好地集成,例如JupyterKubeflow;支持多种数据和流媒体源;并支持通过 CPU 和 GPU 执行。Nuclio项目于2017年启动,并不断快速发展;许多初创企业和企业现在都在生产中使用 Nuclio。

您可以将 Nuclio 用作独立的 Docker 容器或在现有Kubernetes集群之上使用;请参阅 Nuclio 文档中的部署说明。您还可以通过Iguazio 数据科学平台中完全托管的应用程序服务(在云端或本地)使用 Nuclio ,您可以免费试用

如果您希望通过代码创建和管理 Nuclio 函数(例如,从 Jupyter Notebook 中),请参阅Nuclio Jupyter 项目,该项目提供一个 Python 包和 SDK,用于从 Jupyter Notebook 创建和部署 Nuclio 函数。Nuclio 也是用于数据科学自动化和跟踪的新开源MLRun库以及用于构建和部署可移植、可扩展的 ML 工作流程的开源Kubeflow Pipelines框架的组成部分。

Nuclio 速度极快:单个函数实例每秒可以处理数十万个 HTTP 请求或数据记录。这比其他一些框架快 10-100 倍。要了解有关 Nuclio 工作原理的更多信息,请参阅 Nuclio架构文档、阅读Nuclio 与 AWS Lambda的评论,或观看Nuclio 无服务器和 AI 网络研讨会您可以在Nuclio 网站上找到其他文章和教程的链接。

Nuclio 是安全的:Nuclio 与Kaniko集成,允许在运行时以安全且可用于生产的方式构建 Docker 映像。

如需更多问题和支持,请单击加入Nuclio Slack工作区。

为什么另一个“无服务器”项目?

现有的云和开源无服务器解决方案都无法满足无服务器框架的所有所需功能:

  • 以最小的 CPU/GPU 和 I/O 开销以及最大的并行度进行实时处理
  • 与各种数据源、触发器、处理模型和 ML 框架的本机集成
  • 具有数据路径加速功能的有状态函数
  • 跨低功耗设备、笔记本电脑、边缘和本地集群以及公共云的可移植性
  • 开源但专为企业设计(包括日志记录、监控、安全性和可用性)

Nuclio 的创建就是为了满足这些要求。它被有意设计为一个可扩展的开源框架,使用模块化和分层的方法,支持不断添加触发器和运行时,希望许多人能够加入到为 Nuclio 开发新模块、开发人员工具和平台的努力中。

快速启动步骤

探索 Nuclio 最简单的方法是运行 Nuclio 仪表板的图形用户界面 (GUI)。运行仪表板所需的只是 Docker:

docker run -p 8070:8070 -v /var/run/docker.sock:/var/run/docker.sock --name nuclio-dashboard quay.io/nuclio/dashboard:stable-amd64

仪表板

浏览到http://localhost:8070,创建一个项目并添加一个函数。当在编排平台(例如 Kubernetes)外部运行时,仪表板将简单地部署到本地 Docker 守护进程。

假设您正在使用 Docker 运行 Nuclio,作为示例,创建一个项目并部署预先存在的模板“dates (nodejs)”。使用docker ps,您应该看到该函数已部署在其自己的容器中。然后您可以使用curl调用您的函数;docker ps(使用Nuclio 仪表板检查端口号是否正确):

curl -X POST -H "Content-Type: application/text" -d '{"value":2,"unit":"hours"}' http://localhost:37975

如需通过仪表板 UI 或 Nuclio 命令行界面 ( ) 在 Kubernetes 上使用 Nuclio 的完整分步指南nuctl,请探索以下学习途径:

怎么运行的

“当这种情况发生时,就这样做”。Nuclio 试图抽象出围绕发生的事件(例如,一条记录写入 Kafka、发出 HTTP 请求、计时器到期)的所有支架,并将该信息传递给一段代码进行处理。为此,Nuclio 希望用户(至少)提供有关什么可以触发事件以及此类事件发生时要运行的代码的信息。用户通过命令行实用程序 ( nuctl)、REST API 或通过 Web 应用程序直观地向 Nuclio 提供此信息。

建筑学

Nuclio 获取此信息(即 functionhandler和 function configuration)并将其发送给构建器。该构建器将制作函数的容器映像,其中包含用户的处理程序和一个软件,该软件可以在收到事件时执行该处理程序(稍后会详细介绍)。然后,构建器将通过将其推送到容器注册表来“发布”该容器映像。

发布后,即可部署功能容器镜像。部署者将从功能的配置中制作编排器特定的配置。例如,如果部署到 Kubernetes,部署程序将获取配置参数,例如副本数量、自动缩放计时参数、函数请求的 GPU 数量,并将其转换为 Kubernetes 资源配置(即部署、服务、入口等)。

注意:部署者不会直接创建 Kubernetes 本机资源,而是创建“NuclioFunction”自定义资源 (CRD)。称为“控制器”的 Nuclio 服务侦听 NuclioFunction CRD 上的更改,并创建/修改/销毁适用的 Kubernetes 本机资源(部署、服务等)。这遵循标准 Kubernetes 运算符模式

然后,编排器将从已发布的容器映像中启动容器并执行它们,为它们提供功能配置。这些容器的入口点是“处理器”,负责读取配置、监听事件触发器(例如连接到Kafka、监听HTTP)、在事件发生时读取事件并调用用户的处理程序。处理器负责许多其他事情,包括处理指标、整理响应、优雅地处理崩溃等。

缩放至零

一旦构建并部署到 Kubernetes 这样的编排器,Nuclio 函数(即处理器)就可以处理事件、根据性能指标进行扩展和缩减、发送日志和指标 - 所有这些都无需任何外部实体的帮助。部署后,您可以终止 Nuclio 仪表板和控制器服务,Nuclio 功能仍将完美运行和扩展。

然而,缩放到零并不是他们自己能够做到的。相反,一旦缩放到零,当新事件到达时,Nuclio 函数就无法自行扩展。为此,Nuclio 提供了“Scaler”服务。这处理了缩放到零,更重要的是从零缩放的所有问题。

功能示例

以下示例函数实现使用EventContext接口来处理输入和日志,返回结构化 HTTP 响应;(也可以使用简单的字符串作为返回值)。

在围棋中

package handler

import ( "github.com/nuclio/nuclio-sdk-go" )

func Handler(context *nuclio.Context, event nuclio.Event) (interface{}, error) { context.Logger.Info("Request received: %s", event.GetPath())

<span class="pl-k">return</span> nuclio.<span class="pl-smi">Response</span>{
    <span class="pl-c1">StatusCode</span>:  <span class="pl-c1">200</span>,
    <span class="pl-c1">ContentType</span>: <span class="pl-s">"application/text"</span>,
    <span class="pl-c1">Body</span>: []<span class="pl-smi">byte</span>(<span class="pl-s">"Response from handler"</span>),
}, <span class="pl-c1">nil</span>

}

<clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 tooltipped-no-delay d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w" value="package handler

import ( "github.com/nuclio/nuclio-sdk-go" )

func Handler(context *nuclio.Context, event nuclio.Event) (interface{}, error) { context.Logger.Info("Request received: %s", event.GetPath())

return nuclio.Response{
    StatusCode:  200,
    ContentType: &quot;application/text&quot;,
    Body: []byte(&quot;Response from handler&quot;),
}, nil

}" tabindex="0" role="button">

在Python中

def handler(context, event):
    response_body = f'Got {event.method} to {event.path} with "{event.body}"'
<span class="pl-c"># log with debug severity</span>
<span class="pl-s1">context</span>.<span class="pl-s1">logger</span>.<span class="pl-en">debug</span>(<span class="pl-s">'This is a debug level message'</span>)

<span class="pl-c"># just return a response instance</span>
<span class="pl-k">return</span> <span class="pl-s1">context</span>.<span class="pl-v">Response</span>(<span class="pl-s1">body</span><span class="pl-c1">=</span><span class="pl-s1">response_body</span>,
                        <span class="pl-s1">headers</span><span class="pl-c1">=</span><span class="pl-c1">None</span>,
                        <span class="pl-s1">content_type</span><span class="pl-c1">=</span><span class="pl-s">'text/plain'</span>,
                        <span class="pl-s1">status_code</span><span class="pl-c1">=</span><span class="pl-c1">201</span>)</pre><div class="zeroclipboard-container">
<clipboard-copy aria-label="Copy" class="ClipboardButton btn btn-invisible js-clipboard-copy m-2 p-0 tooltipped-no-delay d-flex flex-justify-center flex-items-center" data-copy-feedback="Copied!" data-tooltip-direction="w" value="def handler(context, event):
response_body = f'Got {event.method} to {event.path} with &quot;{event.body}&quot;'

# log with debug severity
context.logger.debug('This is a debug level message')

# just return a response instance
return context.Response(body=response_body,
                        headers=None,
                        content_type='text/plain',
                        status_code=201)" tabindex="0" role="button">
  <svg aria-hidden="true" height="16" viewBox="0 0 16 16" version="1.1" width="16" data-view-component="true" class="octicon octicon-copy js-clipboard-copy-icon">
<path d="M0 6.75C0 5.784.784 5 1.75 5h1.5a.75.75 0 0 1 0 1.5h-1.5a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-1.5a.75.75 0 0 1 1.5 0v1.5A1.75 1.75 0 0 1 9.25 16h-7.5A1.75 1.75 0 0 1 0 14.25Z"></path><path d="M5 1.75C5 .784 5.784 0 6.75 0h7.5C15.216 0 16 .784 16 1.75v7.5A1.75 1.75 0 0 1 14.25 11h-7.5A1.75 1.75 0 0 1 5 9.25Zm1.75-.25a.25.25 0 0 0-.25.25v7.5c0 .138.112.25.25.25h7.5a.25.25 0 0 0 .25-.25v-7.5a.25.25 0 0 0-.25-.25Z"></path>

更多示例可以在示例页面中找到。

进一步阅读

如需支持和其他产品信息,请加入活动的Nuclio Slack工作区。

About

高性能无服务器事件和数据处理平台

Resources

License

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages

  • Go 84.8%
  • JavaScript 6.0%
  • Python 3.0%
  • Less 1.3%
  • Java 1.0%
  • Makefile 0.9%
  • Other 3.0%