本文作者是 Axel Sirota,译者为 StreamNative 的刘昱、Jennifer、Sijia。

原文链接 https://streamnative.io/en/blog/tech/2021-02-10-migrate-to-serverless-with-pulsar-functions。

关于 Apache Pulsar

Apache Pulsar 是 Apache 软件基金会顶级项目,是下一代云原生分布式消息流平台,集消息、存储、轻量化函数式计算为一体,采用计算与存储分离架构设计,支持多租户、持久化存储、多机房跨区域数据复制,具有强一致性、高吞吐、低延时及高可扩展性等流数据存储特性。 
GitHub 地址:http://github.com/apache/pulsar/

Pulsar 2.0 版本引入 Pulsar Functions。Pulsar Functions 支持用户轻松地平滑迁移到无服务应用程序。本文主要介绍 Pulsar Functions 的基本信息以及如何开发 Pulsar Functions。此外,本文还列举了将应用程序迁移到 Pulsar Functions 时的一些注意事项。

简单场景

假设有这样一个使用场景:我们运营一家电子商务公司,公司主要业务是处理支付发票。在 Pulsar 中,这一业务包含以下三步:

• 将发票导入到订单 topic;• 执行代码,以逗号分隔发票值;• 将发票值写入 PostgreSQL。

本文主要介绍第二步。一般来说,我们执行的代码可能是在 AWS Lambda 中创建的无服务 function,也可能是成熟的微服务。这种方法有很多缺点。

首先,我们为一段简短代码开发全面服务。由于开发工作比较复杂,所以完全实现可能需要两周时间。

其次,由于源数据 schema 一直在变,维护工作也会越来越难。我们需要对服务和基础 PostgreSQL 表进行完整的版本控制和重新部署,而这一项工作可能需要至少一天时间。

此外,在连接或断开 Pulsar 时,AWS Lambda function 需要进行身份验证。Pulsar 先调用 Lambda function,然后由 Lambda function 自身向 Pulsar 验证身份。由于 Lambda function 引入了非必要的消息双向传递,因此会影响性能。

引入 Pulsar Functions

Pulsar Functions 是轻量级计算框架,用于处理 topic 之间的数据。Pulsar Functions 在 Pulsar 中运行,因此无需单独部署微服务,节省时间,简化排错。

Pulsar Functions 的复杂性比较灵活。Pulsar Functions 不仅支持从一个 topic 转换/移动数据到另一个 topic,还支持发送数据到多个 topic、进行复杂的路由选择和批处理请求等。

Pulsar Functions 易于调试,支持在调试模式下部署 function,即可以在连接到代码并实时执行时进行调试。

开发 Pulsar Functions

使用熟悉的编程语言创建 Pulsar Function 和实现 Pulsar Functions 子类一样简单。下面的代码使用 Java 语言编写,Pulsar 也支持 Python 和 Go 语言。

public class SplitFunction implements Function<String, List<String>> {@Overridepublic List<String> apply(String input) {return Arrays.asList(input.split(","));}
}

编译并打包代码后,通过 functions create 命令将 function 部署到 Pulsar 实例中。这一命令的参数为打包的代码和 function 的 input/output topic。

bin/pulsar-admin functions create --jar target/split.jar --classname demo.SplitFunction --input input-topic --output output-topic

开发和部署自定义 Pulsar Function 最多需要两天时间。部署完成后,Pulsar Functions 可以为用户极大简化工作量,缩短产品发布时间。Pulsar 支持用户部署任意数量的 Pulsar Function,用于从 topic 获取数据并发送到其他 topic,还可以轻松地将状态消息写入 Pulsar 日志。Pulsar Functions 不仅简化了 Pulsar 的部署流程,增强了 Pulsar 的灵活性,还拓展了 Pulsar 的功能。

开发完整的 Pulsar Functions

如何充分利用 Pulsar Functions 丰富的特性?

开发完整的 Pulsar Function 和在类中实现 Function 接口一样简单。首先实现 process() 方法,process() 方法提供的语义对象即为连接到 Pulsar 的网关。通过语义对象,我们可以访问记录器、追踪输出、向 topic 发送消息等。

使用 Pulsar Functions 获取输入数据并提取发票价格的示例代码如下。我们可以使用语义对象发送这些数据到另一个 output topic(如想在部署 Function 时发送数据到指定的 output topic,只需将其作为 Function 的返回值返回。本示例通过发送数据到另一个 topic 展示如何使用 Pulsar Functions 进行路由,并从 Function 返回 null。)

import org.apache.pulsar.functions.api.Function;
public class RoutingFunction implements Function<String, Void> {@Overridepublic Void process(String input, Context context) throws Exception {Logger LOG = context.getLogger();LOG.info(String.format("Got this input: %s", input));Price inputPrice  = new Price(input);String topic = String.format("year-%s", inputPrice.getYear());context.newOutputMessage(topic, Schema.STRING).value(inputPrice.getPrice()).send();// We could also return some object here and it would be sent to the// output topic set during function submissionreturn null;   }
}

比 AWS Lambda 成本低

既然 AWS Lambda 可以实现我们的需求,为什么我们决定改用 Pulsar Functions?相比于 AWS Lambda,Pulsar Functions 具有一系列优势,易于调试、移除了 Pulsar 和 Lambda 之间的双向身份验证等。

下面我们通过一个常见的使用场景来对比一下使用 AWS Lambda 和 Pulsar Functions 的成本。假设某在线拍卖的实时竞价系统中,每秒竞价 1 万次(每月 260 亿请求),仅考虑请求费用,不考虑计算时间,成本为 5000 美元。假设每个请求需要 100 毫秒和 2048 GB 的虚拟机,则计算成本为 8.6 万美元。这还不包括 AWS 传输数据的费用!

AWS Lambda 是用于无服务 functions 的极佳选择,但只适合用于小规模使用场景。使用 Lambda 处理数十亿笔交易的数据管道开销高昂。

使用 Pulsar Functions 可以极大地节省成本。我刚加入 JAMPP 时,JAMPP 团队只使用 Lambda,一小部分数据管道的成本为每月 3 万余美元。当我们从 AWS Lambda 迁移到 Pulsar Functions 后,成本下降到每月几百美元,而这部分支出主要用于在 Amazon EC2 实例上托管 Pulsar。

迁移到 Pulsar Functions

首先看一下使用 Pulsar Functions 的架构。在示例使用场景中,我们在 AWS Lambda 中编写了一个 Java function 来处理 topic 之间的数据。Pulsar Functions 在这一架构中取代了 Lambda,简化了开发和部署。

部署 Pulsar Functions 后,我们需要为数据创建导入和转存脚本。通过 Pulsar IO[1],用户可以在 Pulsar 内轻松定义外部数据 source/sink,简化了这一过程。Pulsar IO source/sink 本身也是作为 Pulsar Functions 实现的,也就是说,用户可以在 Pulsar 中创建自定义 source/sink,简化调试操作。

迁移到 Pulsar Functions 共需三步:

• 迁移所有处理逻辑到一个或多个 Pulsar Functions• 转换 IO 逻辑(使用 Pulsar IO source/sink)• 使用日志 topic 处理日志数据

仅需三步就可以完全迁移到在 Pulsar 中运行的无服务应用程序。

如果用户目前使用的消息系统是 Kafka,该怎么办?不必担心,无需编写代码,使用 Kafka-on-Pulsar[2] 即可从 Kafka 平滑迁移到 Pulsar。

结语

本文简要介绍了如何使用 Pulsar Functions。除了文中讨论的特性以外,Pulsar Functions 正在新增更多令人眼前一亮的特性。比如,StreamNative[3] 最近宣布发布 Pulsar Function Mesh[4],支持以协调方式部署 Pulsar Function 服务集群。

本文主要介绍了如何开发 Pulsar Functions,如何将应用程序迁移到在 Pulsar 上运行的无服务应用程序,以及 Pulsar Functions 的易用性与灵活性。

预祝迁移顺利!

相关阅读

•译文 | 深度剖析 Pulsar Functions

•译文 | 使用 Apache Pulsar Functions 进行简单事件处理

•译文 | Pulsar Functions 简要指南:原理、目标与规划

引用链接

[1] Pulsar IO: https://pulsar.apache.org/docs/en/2.3.1/io-overview/
[2] Kafka-on-Pulsar: https://github.com/streamnative/kop
[3] StreamNative: https://streamnative.io/
[4] Pulsar Function Mesh: https://www.bilibili.com/video/BV1564y1D76L

点击“阅读原文”,获取 Apache Pulsar 硬核干货资料!

译文|借助 Pulsar Functions 迁移到无服务应用程序相关推荐

  1. 无服务计算的未来和挑战: A Berkeley View on Serverless Computing

    加州大学伯克利分校继 2009 年发布 <The Berkeley View on Cloud Computing>一举拨开云计算迷雾,十年后又一次发布了 <A Berkeley V ...

  2. 博客推荐|使用自定义指标在 Kubernetes 中自动扩展 Pulsar Functions

    本文翻译自 StreamNative 博客<Auto-Scaling Pulsar Functions in Kubernetes Using Custom Metrics>,作者付睿.吕 ...

  3. ASP.NET Core:从ASP.NET Web API迁移的多层数据服务应用程序

    目录 介绍 设置和运行示例应用程序 类库项目 依赖注入 访问应用程序设置 实体框架核心相关更改 主键标识插入问题 数据上下文和连接字符串 自定义存储库(Repositories) LINQ表达式翻新( ...

  4. 无服务计算应用场景探讨及 FaaS 应用实战

    简介: 无服务计算本身是一个概念或者理论模型,落地到具体技术上主要有函数即服务(FaaS)以及后端即服务(BaaS)两种形式,阿里云提供函数即服务 FaaS 产品. 作者 | 宋文龙(闻可)  阿里云 ...

  5. 使用 Go 和 AWS Lambda 构建无服务 API

    原文地址:How to build a Serverless API with Go and AWS Lambda 原文作者:Alex Edwards 译文出自:掘金翻译计划 本文永久链接:https ...

  6. [译] 使用 Go 和 AWS Lambda 构建无服务 API

    原文地址:How to build a Serverless API with Go and AWS Lambda 原文作者:Alex Edwards 译文出自:掘金翻译计划 本文永久链接:githu ...

  7. 单体 soa 微服务 区别_漫谈何时从单体架构迁移到微服务?

    面对微服务如火如荼的发展,很多人都在了解,学习希望能在自己的项目中帮得上忙,当你对微服务的庐山真面目有所了解后,接下来就是说服自己了,到底如何评估微服务,什么时候使用微服务,什么时间点最合适,需要哪些 ...

  8. 10分钟Get拥抱无服务的正确姿势

    戳蓝字"CSDN云计算"关注我们哦! 译|孔子东游 文|Bob Violino 来源|INSIDER PRO 无服务器计算旨在实现基础设施的自动化配置以及消除服务器管理的负担,但是 ...

  9. 从单体架构迁移到微服务

    随着微服务架构的持续火热,网络上针对微服务和单体架构的讨论也是越来越多.去年的时候,社区更多的关注点是在二者的区别以及优缺点辨析上,而今年,越来越多的人开始关注如何从单体架构迁移到微服务上.毋庸置疑, ...

最新文章

  1. linux 为什么 c语言,为什么C程序里一定要写main函数
  2. Spring Boot 集成 RabbitMq 实战操作(二)
  3. LightOJ 1112 - Curious Robin Hood 树状数组
  4. Collecting package metadata (current_repodata.json): done Solving environment: failed with repodata
  5. Python 数据分析三剑客之 Pandas(六):GroupBy 数据分裂、应用与合并
  6. 链表 python 牛客_牛客网《剑指offer》之Python2.7实现:合并两个排序的链表
  7. 第3个项目实操:用类与对象的方法编程
  8. RS232接口芯片内部原理
  9. pb5.0-pb10.0各版本高速下载
  10. uniapp实现上传图片
  11. 选择一个软件外包公司的入职须知!
  12. 活动(已结束)--我们是冠军,啊呸,我们是CSDN VIP
  13. [51单片机]按键部分(软件消抖)
  14. 遇到程序员不修改bug时怎么办?我教你
  15. D3D游戏编程系列(二):自己动手编写即时战略游戏之地图编辑器的制作
  16. 准备VB或C#开发环境(Visual Studio)
  17. C++难学吗?为什么难学?如何去学?
  18. AI换脸为什么服务器没响应,AI换脸云服务器
  19. 交互式SQL(Transact SQL,TSQL)
  20. 金税盘 实时上传服务器信息,金税盘上传参数怎么设置

热门文章

  1. 易观CTO郭炜:如何构建企业级大数据Ad-hoc查询引擎
  2. VBA几个常用的模块
  3. 24v升100/110/150/200高压电源模块
  4. mysql数据库数据的删除与恢复
  5. 什么是 Kubernetes?
  6. 思科3560-X交换机
  7. 如何掌握无人机生态环境监测、图像处理与 GIS 数据分析
  8. 全程物流可视化管理新模式
  9. 如何选择靠谱的区块链技术服务商?佰忆科技有秘籍
  10. python自动写作ai_论文自动写作之自动添加参考文献