#30DaysofAppwrite:Appwrite 的构建模块
引言
由 Mux 赞助的 DEV 全球展示挑战赛:展示你的项目!
引言
Appwrite 是一个开源的、可自托管的后端即服务 (BaaS) 平台,它提供一套 SDK 和 API,让应用开发更轻松、更高效。 #30DaysOfAppwrite是一项为期一个月的活动,旨在带领开发者全面了解 Appwrite 的所有功能,从基础知识到云函数等高级功能,应有尽有!与此同时,我们还将构建一个功能齐全的 Medium 克隆平台,演示如何在构建实际应用时应用这些概念。此外,我们还为参与活动的开发者准备了丰厚的奖品!
Appwrite 的微服务
欢迎来到第三天👋
今天,我们将深入剖析 Appwrite 的技术栈,了解其底层工作原理。我们将介绍Appwrite 的 docker-compose 文件,并逐一介绍 Appwrite 使用的所有容器。Appwrite 的设计初衷是运行在云原生环境中,为了秉承这一理念,Appwrite 被便捷地打包成一组 Docker 容器(确切地说是 18 个!)。
这是 Appwrite 架构的概述,我们将在下一节中详细介绍其中的大部分组件。Appwrite 中的每个容器都独立处理一个微服务。由于采用了容器化设计,每个服务都可以独立于其他微服务进行扩展。
目前,所有 Appwrite 微服务均通过私有网络上的 TCP 协议进行通信。请注意,除默认用于暴露 Appwrite HTTP API 的公共端口 80 和 443 外,请勿将任何服务暴露给公共网络。
Appwrite
这是Appwrite 的主容器,所有复杂的功能都在这里运行!该容器基于托管在此处的Dockerfile 构建。Appwrite 主容器实现了 Appwrite API 协议,并处理身份验证、授权和速率限制。此微服务完全无状态,可以轻松复制以实现可扩展性。
特拉菲克
Traefik 是一个用 Go 语言编写的现代化反向代理和负载均衡器,它简化了微服务的部署。Traefik 可以与您现有的基础架构组件集成,并自动动态地进行配置。我们使用 Traefik 作为 Appwrite 各个 API 的主要入口点。Traefik 还负责提供 Appwrite 自动生成的 SSL 证书。此微服务完全无状态。
Redis
Appwrite 使用 Redis 来实现三个主要功能。
- 缓存:Appwrite 使用 Redis 内存缓存来更快地获取数据库查询结果。
- 发布/订阅:Appwrite 使用 Redis 和 Resque 作为发布/订阅机制,在 Appwrite API 和不同的工作进程之间传输消息。
- 计划任务:Appwrite 使用 Redis 通过调度容器存储和触发未来的任务。
Appwrite 的 Workers
Appwrite 中有很多异步任务需要执行——一个很好的例子就是记录 Appwrite API 的使用统计信息。
我们使用内部发布/订阅系统Resque来收集所有这些任务。各个工作进程会消费这些任务并独立执行。我们有八个消息队列,每个队列都对应八个工作进程。
-
审计人员
审计工作进程会从队列中读取消息
v1-audits。Appwrite 定义了一组系统事件,详情请见此处。当这些事件发生时,审计工作进程会将它们记录到日志中mariadb。审计工作进程使用了 utopia-php/audit库。 -
证书工作者
证书工作进程会从队列中读取消息
v1-certificates。它使用certbotLet's Encrypt 的服务来创建和定期续订 SSL 证书。我们将在下一篇文章中详细介绍 SSL 证书以及证书工作进程。敬请期待。 -
删除工作进程
删除工作进程从队列中读取消息
v1-deletes。顾名思义,它负责在 Appwrite 数据库中执行删除操作。文档、用户、项目、函数等的删除请求均由删除工作进程处理。目前,删除工作进程会在某些 API 请求以及维护工作进程触发时被调用。 -
函数工作者
Functions工作进程从队列中消费消息
v1-functions,并处理与 Appwrite 异步云函数相关的所有任务。同步函数则跳过 Functions 工作进程,直接发送到 Executor。 -
执行人
执行器负责 Appwrite 与所使用的编排服务之间的所有通信。它处理函数的执行、删除、构建函数等操作。
Appwrite 中的云函数可以通过三种方式触发:
执行器负责所有繁重的工作,使云函数能够顺利启动并运行。从启动时拉取相应环境的 Docker 镜像,到管理和运行容器以及响应错误,执行器统统包办!
-
邮件工作人员
邮件工作进程从队列中消费消息
v1-mails,并且只负责一个功能:发送电子邮件!它只是收集信息并使用PHPMailer发送它们。 -
任务工作者
Tasks工作进程从队列中消费消息
v1-tasks。
Appwrite 的 Tasks API 允许您安排应用需要在后台运行的任何重复性任务。每个任务都是通过定义 CRON 计划和目标 HTTP 端点来创建的。
每个任务都可以定义任何 HTTP 端点,并支持任何 HTTP 方法、标头或基本 HTTP 身份验证。在 Appwrite 控制台中,您可以查看所有任务、它们的当前状态、上次和下次运行时间,以及响应日志,以查看先前执行的结果。
-
使用工作器
使用情况工作进程从队列中消费消息
v1-usage,并利用UDP 连接statsd向目标发送消息。然后,使用情况统计信息会被记录下来,包括函数执行统计信息、请求总数、存储统计信息等。telegrafinfluxDB -
数据库工作器
数据库工作进程负责创建和删除数据库属性和索引。
-
Webhooks 工作器
Webhooks工作进程从队列中读取消息
v1-webhooks,并触发在 Appwrite 控制台中注册的 Webhook。该工作进程会检查发生的事件,并通过发出 CURL 请求来触发相应的 Webhook。
Webhook 允许您构建或设置集成,以订阅 Appwrite 上的特定事件。当这些事件之一被触发时,我们会向 Webhook 配置的 URL 发送 HTTP POST 请求。Webhook 可用于清除 CDN 缓存、计算数据或发送 Slack 通知。您的想象力就是唯一的限制。
此外,我们还有两名工作人员负责将任务分配给其他工作人员。
-
维修工
维护工作进程对应于
appwrite-maintenancedocker-compose 文件中的服务。维护工作进程负责执行一些维护任务,以防止 Appwrite 服务器随着时间的推移而崩溃!目前,维护工作进程会将删除任务委派给appwrite-worker-deletes其他进程,由后者执行实际的删除操作。我们使用维护工作进程来调度三种类型的删除操作: -
清理滥用日志
-
清理审计日志
-
清理执行日志
-
安排工人
Schedules 工作进程对应于
appwrite-scheduledocker-compose 文件中的服务。Schedules 工作进程底层使用Resque Scheduler ,负责 Appwrite 中所有 CRON 作业的调度。这包括来自 Tasks API、Webhooks API 和 functions API 的 CRON 作业。
Mariadb
Appwrite 默认使用 MariaDB 作为项目集合、文档和所有其他元数据的数据库。Appwrite 本身并不依赖于底层使用的数据库,目前正在积极开发对Postgres、CockroachDB、MySQL和MongoDB等更多数据库的支持!😊
ClamAV
ClamAV 是一个 TCP 反病毒服务器,负责扫描所有用户上传到 Appwrite 存储的文件。ClamAV 微服务是可选的,可以通过 Appwrite 环境变量禁用。从 Appwrite 0.8 版本开始,为了在配置较低的环境中节省内存,此功能默认处于禁用状态。如果您遇到内存占用过高的问题,可以点击此处了解如何禁用此功能。
InfluxDB
Appwrite 使用 InfluxDB 来存储项目的 API 使用指标和统计数据。它也是生成 API 使用情况图表和处理时间序列数据的引擎。
电报
Telegraf 是一个插件驱动的服务器代理,用于收集来自多个数据源的指标和事件,并将其发送到多个目标位置。Telegraf 通过在将数据发送到数据库之前对其进行聚合,从而起到保护 InfluxDB 的作用。Telegraf 基于 UDP 协议运行,这使得数据传输速度极快!
鸣谢
希望您喜欢这篇文章。您可以关注社交媒体上的#30DaysOfAppwrite 话题,了解我们的所有动态。完整的活动时间表请点击此处查看。
如果您想了解更多关于 Appwrite、外星人或独角兽🦄的信息,欢迎随时通过 Discord 联系我们。敬请期待明天的文章!下次见👋
文章来源:https://dev.to/appwrite/30daysofappwrite-appwrite-s-building-blocks-1936