我有一个rails 4应用程序,它使用carrierwave和Amazon s3进行图像上传。我还为我的移动应用程序构建了一个rest api来与数据库通信。
通过应用程序处理图像存储的最佳方式是什么(这样他们的网站和应用程序保持一致)?
现在,我正在考虑两种选择之一。
会喜欢一些有关最佳方法的反馈 - 或者是否还有另一种方法。对api来说仍然是新手,并且有一个网络应用和移动应用通信。如果您已经知道有关此主题的文档,请告诉我们。日Thnx!
答案 0 :(得分:3)
第二种选择对我来说更容易下注。
第一种选择依靠移动设备来保持数据的一致性,这在实践中非常困难 - 好吧,也许“不可能”,至少是不可靠的。移动设备在任意时间失去连接,并且当它在S3上载和API调用之间发生时,一致性会丢失。对于目标应用程序而言,这种一致性可能并不重要(它取决于您对API的操作),但它通常是一个必不可少的属性,只是为了知道系统状态是什么,以及何时进行调试。将S3存储委托给API可将一致性问题转移到单点,通信更可靠。
第二种选择提供额外的优势。通过您的“专有”API,您使用的实际存储无关紧要。今天是S3,但明天的定价可能会引导你到另一个后端。在抽象存储细节的API背后,您可以随时随地进行更改。
另一个优点是安全性。 API成为唯一具有写访问权限的可信方。所有移动设备都只具有只读权限。更容易管理和保证一定程度的安全性。更不用说安全问题,代码中的错误可能会让某些设备覆盖其他人的图像。
通过API,Google Analytics也可以更全面或更细粒度。
我相信还有一些我不记得的好处,还有一些问题,比如潜在的瓶颈/单点故障。总的来说,第二个选择对我来说是你提出的条件的最佳选择。
答案 1 :(得分:1)
我建议你先选择。 有两个原因:
Carrierwave上传图像并同时将模型保存到数据库。 这意味着如果您在没有通过carrierwave的情况下上传图像,则在保存模型时,carrierwave将再次上传图像。
Carrierwave会在上传图片时按照您对carrierwave的设置命名图片。我可以想象你会设置随机名称以保持唯一。因此,您需要通过carrierwave获取图像名称。
所以我相信如果你选择其他选择,那就很难了。