本文为缺乏WEB工程经验的算法工程师 提供一个起步的WEB项目实践. 我们用一个简单的例子来说明如何开发一个完整的算法服务(基于HTTP协议).
需求 n n n个用户分配资产, 总金额为 M M M. 我们需要为用户提供一个资产分配的算法服务.
考虑因素
- 分配方式有多种: 例如平均分, 按比例分. 不同的场景下可能会采用不同的分配方式.
- 考虑业务约束: 年龄段在18岁至60岁之间的用户才能分到钱.
- 后续可能会增加新的业务约束和分配方式.
(虽然这个问题很简单, 但是我们把它想象成一个复杂的项目来实施, 借此掌握一些基本的开发流程.)
在这个例子中, 我们介绍的开发流程如下:
- 算法架构设计
- 创建项目
- 定义接口
- 实现接口
- 单元测试
- 性能调优(缓存/线程池配置)
- 打包和部署
1. 算法架构设计
架构设计的核心思想是模块化, 把需要实现的算法服务拆分成多个模块, 使得各模块之间低耦合且高内聚. 这样做的好处是一个项目可以由多人合作, 不仅能加快开发速度, 而且能降低整个系统的复杂性.
考虑到要实现的功能包含两个核心要素:
- 分配资产. 即, 实现资产分配算法;
- 筛选符合条件的用户. 即, 对满足条件的用户分配资产.
首先, 我们把核心功能拆成两个模块:
- 业务约束(Constraint) 输入用户列表, 输出有效的用户.
- 分配器(Allocator) 输入用户列表和资产总金额, 输出每个用户分配到的金额.
其次, **数据模块(Data)**负责获取数据库中的用户信息, 为Constraint模块和Allocator模块提供基础数据支持. 在本例中, 我们把用户数据用JSON格式保存在本地.
第三, 算法的实际调用由服务层中的**分配服务(AllocationService)**模块实现.
最后, 在Web层实现对HTTP请求的响应, 即返回分配服务(AllocationService)计算的结果.
因此我们得到一个简单的分层架构(见下图).
2. 构建代码框架
本项目基于Java的Spring Boot框架实现, 原因是框架帮我们提供了丰富的工程层面的工具, 例如实现HTTP接口, 日志, 线程池, 缓存等. 我们可以用IDE工具IntelliJ IDEA新建项目, 详细方法可以参考:
按照上面的架构图, 我们把项目的文件结构按照下图组织.
+ beans # 基础数据结构
+ configs # 配置类
+ core # 核心模块的实现
| + allocator # 分配器
| + constraint # 业务约束
| + data # 用户数据
+ service # 调用core中的模块, 实现功能
+ web # 调用service实现HTTP接口
3. 定义接口
我们采用自顶向下(Top-Down)的设计方法.
3.1 Web接口
-
URL: /allocate
-
请求方式: POST
-
输入: JSON
字段名 类型 是否必填 默认值 说明 userIds Array 是 - 用户id列表 totalReward Double 是 - 待分配的总资产 示例
{ "userIds": ["10001", "10002", "10003"