企业项目管理、ORK、研发管理与敏捷开发工具平台

网站首页 > 精选文章 正文

Elixir实战:7 构建并发系统 (1)与 Mix 项目合作

wudianyun 2025-01-27 00:39:34 精选文章 19 ℃

本章涵盖

  • 与 Mix 项目合作
  • 管理多个待办事项列表
  • 持久化数据
  • 过程推理

到目前为止,您看到的并发示例依赖于单个服务器进程实例。但典型的 Elixir 和 Erlang 系统由大量进程驱动——其中许多是有状态的服务器进程。一个中等复杂的系统运行几千个进程并不罕见,而更大的系统可能由数十万甚至数百万个进程驱动。请记住,进程是廉价的,因此您可以大量创建它们。由于消息传递并发,推理高度并发的系统仍然相对容易。因此,在不同的进程中运行不同的任务是有用的。这种高度并发的方法通常可以提高系统的可扩展性和可靠性。

在本章中,您将看到一个由多个进程协作提供完整服务的更复杂系统的示例。您的最终目标是构建一个分布式 HTTP 服务器,能够处理许多同时操作多个待办事项列表的最终用户。您将在接下来的章节中完成这一目标,并在第 12 章达到最终目标。在本章中,您将开发一个处理多个待办事项列表并将其持久化到磁盘的基础设施。

但首先,让我们看看如何使用 mix 工具管理更复杂的项目。

7.1 与 Mix 项目合作

随着代码变得越来越复杂,将所有模块放在一个文件中变得越来越笨拙。现在是开始处理多文件项目的合适时机。

第二章简要提到,Elixir 附带了 mix 工具,您可以使用它来创建、构建和运行项目,以及管理它们的依赖关系、运行测试和创建自定义项目任务。在这里,您将学习足够的 mix 以创建和运行一个项目。额外的 mix 功能将在需要时介绍。

您将使用 mix 为待办事项列表创建一个项目。在命令行中输入以下内容:

$ mix new todo

这会创建 todo 文件夹及其下的项目结构。结果是一个仅包含少量文件的文件夹,包括一个 readme 文件、单元测试支持文件和.gitignore 文件。混合项目非常简单,不会引入太多自动生成的文件。

提示 本书没有对 mix 工具进行详细的处理。相反,必要时会介绍基本功能。要了解更多关于 mix 的信息,请参阅 Mix 指南的介绍(https://mng.bz/A8do)。此外,您可以从命令行运行 mix help 以获取可用命令的列表,并使用 mix help command 获取特定命令的详细帮助。最后,关于 mix 的在线参考可在 https://hexdocs.pm/mix 获取。

一旦项目就位,您可以进入其文件夹并从那里运行 mix 任务。例如,您可以使用 mix compile 命令编译项目,或者您可以使用 mix test 运行测试。

您还可以使用一种特殊的方式启动 iex ,这在您想在 Elixir shell 中玩 Mix 项目时非常有用。当您运行 iex -S mix 时,会发生两件事。首先,项目被编译(就像 mix compile 一样)。如果成功,shell 将启动,并且可以引用和使用项目中的所有模块。

使用 mix ,可以将您的代码组织成多个文件和文件夹。您可以将.ex 文件放在 lib 文件夹下,它们会自动包含在下一个构建中。您还可以在 lib 文件夹下使用任意嵌套的子文件夹。

文件命名和组织没有硬性规则,但有一些推荐的惯例:

  • 您应该将模块放在一个公共的顶级别名下。例如,模块可以被称为 Todo.List 、 Todo.Server 或类似的名称。这减少了在将多个项目合并为一个系统时模块名称冲突的可能性。
  • 一般来说,一个文件应该包含一个模块。偶尔,如果一个辅助模块很小并且仅在内部使用,它可以与使用它的模块放在同一个文件中。如果您想为模块实现协议,也可以在同一个文件中进行。
  • 文件名应为其实现的主模块名称的下划线命名(即蛇形命名)版本。例如,一个 TodoServer 模块将位于 lib 文件夹中的 todo_server.ex 文件中。
  • 文件夹结构应与多部分模块名称相对应。名为 Todo.Server 的模块应位于 lib/todo/server.ex 文件中。

这些不是严格的规则,但它们是 Elixir 项目以及许多第三方库使用的规则。

处理完这些后,您可以开始向项目中添加代码。在第 4 章中,您开发了模块 TodoList 。在第 6 章中,作为练习的一部分,您开发了 TodoServer 模块,该模块实现了一个服务器进程,用于维护单个待办事项列表的状态。这两个模块的最终版本位于第 6 章的 todo_server.ex 文件中。

现在,您将把这些模块的代码添加到新生成的 todo 项目中。您需要做的是:

  1. 删除文件 todo/lib/todo.ex。
  2. 删除文件 todo/test/todo_test.exs。
  3. 将 TodoList 代码放入 todo/lib/todo/list.ex 文件中。将模块重命名为 Todo.List 。
  4. 将 TodoServer 代码放入 todo/lib/todo/server.ex 文件中。将模块重命名为 Todo.Server 。
  5. 将所有对 TodoServer 的引用替换为 Todo.Server ,将所有对 TodoList 的引用替换为 Todo.List 。

最终版本已在待办文件夹中可用。现在,您可以使用 iex -S mix 启动系统并验证其是否正常工作:

$ iex -S mix
 
iex(1)> {:ok, todo_server} = Todo.Server.start()
 
iex(2)> Todo.Server.add_entry(
          todo_server,
          %{date: ~D[2023-12-19], title: "Dentist"}
        )
 
iex(3)> Todo.Server.entries(todo_server, ~D[2023-12-19])
[%{date: ~D[2023-12-19], id: 1, title: "Dentist"}]

此时,待办代码在 Mix 项目中,您可以继续通过添加额外功能来扩展它。

最近发表
标签列表