您将如何设计托管的Web应用程序?我正在寻找像Basecamp,Campaign Monitor,Freshbooks等应用程序......用户可以在线注册并为他们托管应用程序。
编辑: 我找到了一篇讨论多租户数据架构的MSDN文章: http://msdn.microsoft.com/en-us/library/aa479086.aspx#mlttntda_topic4
答案 0 :(得分:2)
请参阅37signals - 他们是这一领域的专家,并且有很多文章可以回答社区问题(很多人都会提出问题)。
High Scalability = 37signals Architecture
Ask 37signals: How do you process credit cards?
关于数据库的数量,来自What do you want to know?
中的David Heinemeier Hansson一些技术答案......
Lance,我们所有的预定结算 操作是自动化的。什么 那会让我们疯狂。 确保这一点尤为重要 应急处理到位 对于失败的信用卡。最后我 看着,我相信我们收费的5% 由于信用卡而反弹 过期,超过限制,或 关闭。一定要处理 正常。
我们只使用Authorize.net和a 单独的信用卡申请(微小的 应用程序在Rails中开发并由 内部网络上的其他应用程序 通过REST)保持数字 安全
沃伦,我们免费运行并支付账户 在同一个数据库上。这是一个 每个应用数据库。一个数据库 每个帐户通常是真的, 真的很糟糕。通常数据是 相当正常化,但我们是 绝对没有宗教信仰。一世 通常重视我的源代码 架构。所以,如果我能得到 通过弯曲更好/更漂亮的源代码 一个架构,我通常会这样做。但 从规范化和非规范化开始 作为性能或代码结构 要求它。
杰森,我们使用电子邮件短信。全美国 运营商有一个 phone@carrier-gateway.com网关。 杰克,好啊,好吧,但是确实如此 它缩放“问题。我回答了 几年前。什么都没有 从那以后我们改变了。我们管理 数以百万计的动态 每天都要求没有 诉诸于缓存(大多数 屏幕在我们的大多数应用程序 在每个用户的基础上是不同的,所以 传统的缓存方案更难 申请)。还有很多其他的Rails 管理数十个的应用程序 数以百万计的每日请求。所有 跟随或多或少相同的共享 没什么办法。所有的技术 为了扩大高和高 那里。这不是一个交钥匙 解决方案,但任何承诺 通常只是满满的。
答案 1 :(得分:2)
如果您只谈论成千上万的客户(相比数十万或数百万),那么差异非常小,除非您知道每个客户可能拥有数千行或更多的表。那么你的设计可能会改变。
基于关系数据库的数据存储的正常设置将在大多数表上放置customer_id
外键。然后就是不要向除了那个客户之外的任何人显示该数据(或者在他们以某种方式表明显式权限被授予其他人的情况下)。
在看起来您可能在一个表中开始拥有数百万行之前,不要过于担心RDBMS扩展问题。然后可能是时候调查分布式键/值存储。但请记住,这类问题是一个很好的问题,因为这可能意味着你赚了大量现金。
即,当你来到它时,越过缩放桥。尽可能地设计当前的能力,但除此之外,过早的优化是所有邪恶的根源。
答案 2 :(得分:2)
我是许多SaaS应用程序的顾问,所以看过不同的架构。我建议:
所有客户的一个数据库。确保将数据库设计得很好,以便为用户提供主键,这是您自己的唯一ID。我已经看到了一些混乱,其中设计有效(实际上不是,但它可能也有)像电子邮件,电话号码等作为主键。另外,不要把所有内容都扔进一个巨大的用户表中。
您希望在某些时候开始跟踪大量用户互动行为。为此,您可以使用NoSQL名称 - 值存储,并开始将事件放入其中以供以后分析。或者,使用类似MixPanel或KISSmetrics的东西。
通过将行写入KPI表来跟踪每日KPI,以便于查询随时间发生的情况。否则你最终会想要询问数据库的问题并发现这是一个巨大的查询。
拥有单个SQL数据库的一个关键优势是,如果您的营销人员知道SQL(推荐!),那么他们可以直接查询它。如果你采用NoSQL路线,那就更难了,然后营销开始做出通常是错误的假设,并且你会浪费很多时间根据这些假设走错路。