spring - 在微服务架构中存储文件的正确方法是什么?
问题描述
我目前正在开发一个传统的单体应用程序,但我正在将其分解为由 kubernetes 管理的 Spring 微服务。该应用程序允许上传/下载大文件,这些文件通常存储在主机文件系统中。我想知道在微服务架构中持久保存这些文件的最可行方法是什么?
解决方案
有很多地方可以存储您的数据。它还取决于您能够花费的预算(保留重复数据也意味着需要更多的存储空间,这也需要花钱),并且主要取决于您的业务需求。
- 是否始终需要所有数据?
- 是否有与地理/地区相关的案例?
- 读/写操作需要多快?
- 东西需要缓存吗?
- 有状态还是无状态?
- 有操作要求吗?这应该如何维护?
- ...
您的微服务不应该知道数据实际存储在哪里。在 kubernetes 中,您可以使用 Persistent-Volumes https://kubernetes.io/docs/concepts/storage/persistent-volumes/,它可以链接到您的云提供商的存储或其他东西。微服务应该只挂载该卷并能够将其视为本地文件。
请注意,云提供商存储已经包含了扩展、并发等解决方案。所以我可能会在后台使用单个 Blob-Storage。
然而不得不说,有一种趋势将微服务理解为耦合在一起的数据和逻辑的包,并接受复制数据,这会带来更好的可扩展性。
有关更多信息,请参阅:
- http://blog.christianposta.com/microservices/the-hardest-part-about-microservices-data/
- https://github.com/katopz/best-practices/blob/master/best-practices-for-building-a-microservice-architecture.md#stateless-service-instances
- https://12factor.net/backing-services
- https://blog.twitter.com/engineering/en_us/topics/infrastructure/2017/the-infrastructure-behind-twitter-scale.html
推荐阅读
- machine-learning - 随机森林特征重要性何时失效?
- yii2 - 我无法访问 yii2 调查扩展来创建表单
- c# - Windows 桌面应用程序中的离线地图
- c# - 显示一个 ui 元素 X 秒或直到用户与之交互,然后检索用户输入
- c# - 如何在 C# 中的 DOC 文件上添加水印?不是 DOCX 文件
- javascript - 我试图从颜色选择器中获取颜色代码
- android - TextView 和 ProgressBar 值在当前活动的回击后未更新然后返回该活动
- java - 使用 Rest Assured GET 方法获取错误代码 503
- angular8 - 模拟函数调用时如何检查发射值
- java - 如何在 RestTemplate 上应用 PowerMockito