- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我在一家大型在线商店工作。目前我们的架构有点奇怪,我们有微服务实际上都共享同一个数据库(根本不能正常工作......)。我正在考虑改进它,但在如何使它们独立方面存在一些挑战。
这是一个用例。我有客户,客户购买产品。假设我有 3 个微服务:客户身份验证、订单管理、产品管理。订单链接到客户和产品。您能否描述以下问题的解决方案:
我想不出我们代码的任何部分没有这种关系。我能想到的解决方案之一是复制数据。例如。当客户购买东西时,订单管理服务将存储客户详细信息和产品详细信息。您最终会进行大量数据复制,不确定这是否是一件好事,我仍然会担心一致性。
我找不到解决这些问题的论文。有哪些不同的选项?
最佳答案
At the moment our architecture is something weird where we have microservices which actually all share the same DB (doesn't work well at all...). I am considering improving that but have some challenges on how to make them independant.
恕我直言,通过为订单、客户和产品提供一个 OLTP 数据库,架构更加简单,因为它允许您使用 JOINS 和存储过程。可能是数据库可以使用一些配置和调整 TLC 与软件重新架构。当您考虑如何解决性能问题时,请保持这扇门敞开。
How do you make the link between an order and a customer?
在 orders
表中有一列用于 customer_id
。 orders
表中的 customer_id
字段将是 customers
表中 id
字段的外键。这将为您提供最佳性能。
您可以对已删除的用户(及其订单)进行定期清理或基于事件的清理。但请确保这些旧订单和客户存储在某个地方。也许存档表或后端数据仓库可以对这些数据进行报告和分析 (OLAP)。
Let say both services share a customer ID, how do you handle data consistency? If you remove a customer on the customer service side, you end up with inconsistency. If your service has to notify the other services then you end up with tighlty coupled services which to me sounds like what you wanted to avoid in the first place. You could kind of avoid that by having an event mechanism which notify everyone but what about network errors when you don't even know who is supposed to receive the event?
有多种方法可以做到这一点。如前所述,您可以创建一个事件来处理客户删除或定期进行数据库清理。但有一件事是肯定的,订单服务不需要在清理完成时得到通知,除非你想要它。不需要,但如果您希望通过订单服务完成订单剔除,则可能需要。执行此操作的简单方法是创建一个存储过程,将 customer_id(或 customer_id 的列表)作为输入并从订单表中删除与该 customer_id 匹配的所有订单。请务必做好数据备份,以便日后进行数据分析和审计。
I want to do a simple query : retrieve the customers from US that bought product A. Given that 3million people bought product A and we have 1 million customers in the US; How could you make that reasonably performant? (Our current DB would execute that in few milliseconds)
这也是为什么将客户、产品和订单表保存在同一个数据库中是有意义的,因为当它们在同一个数据库中时,可以更轻松地快速执行此查询。您可以利用数据库的设计和优化工具以及 EXPLAIN/DESCRIBE 输出来调整表索引等。如果您使用的是 Mysql,则可以更改数据库引擎(我推荐 TokuDB 数据库引擎)。
最后,我的主要建议是为 OLTP 保留一个数据库。因为您将在相同数量的硬件上获得更高的效率和性能。将 DB 拆分为多个 DB 会对您的代码、体系结构、网络和 CPU 产生间接成本。重要的是您的数据库可以水平扩展,并且可以针对对其进行的查询进行微调。移动OLAP到它自己的数据库。这可以使用 ETL 来完成将数据从 OLTP 数据库移动到 OLAP 数据库。您示例中的查询听起来像是在 OLAP 数据库中完成的查询。对于您的 OLAP 数据库,您可以使用列式数据库,例如 Vertica 或可以轻松水平扩展的等效数据库。需要注意的重要一点是,通过拆分您的 OLAP 和 OLTP,您可以针对各自的目的调整和配置它们。
无论您将客户、订单和产品服务作为整体(我的建议)还是作为微服务运行,数据库设计都不应更改。如果您将 OLTP 数据库拆分为多个数据库,将会导致您的代码中的查询发生变化,因为现在您无法执行简单的 JOIN 或存储过程。
这就是 Martin Fowler 所说的 Monolith First。 http://martinfowler.com/bliki/MonolithFirst.html
关于restful-architecture - 在线商店和微服务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32217639/
我有一个 PowerBI Online 数据集,它是在 PowerBI 桌面中创建然后在线发布的。到目前为止,一切都很好。 我通过 PowerBI pusblish 从 Excel 连接到数据集,按预
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 2 年前。
我必须对一些太大而无法放入内存的数据训练分类模型,我正在使用 scikit learn 和 pandas 来进行分析。所以这是我的问题,如何在在线学习管道中使用验证来调整超参数? 我使用带有chuck
我正在开发一个应用程序,该应用程序将从 webservice 获取数据和图像并将其存储在设备中以供离线使用。同时,应用程序会将一些数据存储在 sqlite db 中,并将一些图像作为默认数据。 这是应
是否可以使用 FileReader API 和 onprogress 事件访问随 HTML5 传入的数据? 如果是这样,是否有 MD5 或其他快速散列算法的“在线”版本,以便我可以在文件完全读取之前开
希望任何人都可以帮助我更改下面的代码,我的临时文件包含以下代码: Temp=8.4* Humidity=70.4% 代替代码 Temp = 24 *C, Hum = 40 % 适用于以下脚本。 我需
我必须创建一个功能类似于联系人应用程序的应用程序。您可以在客户的 iPhone 上添加一个联系人,它应该会上传到客户的 iPad 上。如果客户在他们的 iPad 上更新联系人,它应该会在他们的 iPh
在 gitlab.com 上审查 merge 请求时,有时我必须在完成 merge 之前进行 rebase。 在 gitlab 上按“Rebase”后,我有一个特定的管道步骤失败,因为它无法验证用户的
关闭。这个问题是off-topic .它目前不接受答案。 想改善这个问题吗? Update the question所以它是 on-topic对于堆栈溢出。 9年前关闭。 Improve this q
我正在尝试在 azure 上托管 SQL 服务器以与节点应用程序进行通信。我已经成功地完成了创建数据库服务器和数据库本身的过程。现在,我想编辑我的数据库结构。据我发现online ,应该有一种方法可以
我在 Quickbooks Intuit 开发人员 API 中使用 Oauth 2 获得了访问 token 。 范围是 com.intuit.quickbooks.accounting 我能够使用 Q
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 6年前关闭。 Improve thi
是否可以使Angular Material progress spinner与文本并大致与字符的大小一致地显示? 我想要类似的东西: please wait 微调器仅与“请稍候”文本成行出现。 这可
关闭。这个问题不满足Stack Overflow guidelines .它目前不接受答案。 想改善这个问题吗?更新问题,使其成为 on-topic对于堆栈溢出。 7年前关闭。 Improve thi
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用资料或专业知识的支持,但这个问题可能会引发辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the
我有一个每天运行的Powershell脚本。今天它失败了,因为我正在使用的域 Controller 不可用。在继续执行脚本的其余部分之前,我想确保可以连接到可用的DC。 $LdapServer = "
我想制作一款在线 Flash 游戏,它将具有社交功能,但游戏玩法将主要是单人游戏。例如,屏幕上不会同时出现两个玩家,社交互动将通过异步消息进行,不会有实时聊天或其他任何内容。大部分逻辑将发生在客户端中
这几天我开始在线玩OpenShift。我部署了一个非常简单的“Hello World”Java 示例(1 行代码!),没有任何依赖项(没有 Spring!)命令行是这样的: oc.exe new-a
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
所以我一直在网上学习Java(初学者),并且我一直在尝试制作一个用于制作矩形的类文件。但是,我的在线 java 评估器指出它找不到实例变量。 This is the comment on it.我的代
我是一名优秀的程序员,十分优秀!