首先,你确定你需要分库?所谓的高负载就是要分库么?你数据量有哪么大么?有多大,单表记录数量上亿了么?这活你收的钱上几十万、上百万了吗?
不要想当然!
或许有天是有可能有大么大数据量,这个时候你需要 找个 DBA! 介于你是一个外包,不可能走前面条路,你可以选择用 Aliyun RDS 之类的服务,让云服务提供商帮你管理数据库。
此外你还需要从应用层考虑如何实现分表,基于什么条件拆分,这个在一开始就要考虑好。
我和 @qhwa @psvr @sapronlee @tuliang @wxianfeng 在阿里云搞过一次这样的场景,接手了一个项目,主业务的表已经有超过 10 亿的数据量了,我们从一开始设计项目的时候就得考虑分库分表的问题。
但你光靠 Rails 或 Ruby 的技术栈是没法的(或者说很难搞下来的),同时这也是作为 Web 开发或者 Web 架构师很难。我们只是负责从应用层,让业务、数据结构的设计能符合基于某些字段条件进行分表(例如 user_id),基于 user_id 取余 1024 来分表,背后的分表规则处理是由一个介于应用服务和数据库之间的 Proxy 服务来实现,里面会基于一些预定的分库分表规则将 SQL 语句指向到不同的数据库或表(开源社区应该有类似的方案)。
关于你问的事务问题,其实就是要从设计分表字段的地方考虑好,避免跨表跨库的查询出现(当然是尽可能的)。
当然具体执行起来时非常繁琐复杂的,而且还要破坏 ActiveRecord 的一些基础结构,我们甚至都为了实现这样的支持,在应用里面给 ActiveRecord 打了一些 Monkey Patch。
此外,我认为,我们绝大多数人(指 Rails Web 开发)顶多能发展为应用架构师,而不是系统架构师或者 DBA,这些场景是专业领域,应该在合适的时机找专业的人配合。不可能全部吃透,人的经历(精力)有限,光搞好应用架构都需要非常多知识。这年头 Aliyun 这样的一整套云服务目的就是为应用架构师服务的,那些背后复杂的服务器运维、数据库管理等工作让专业的人来独立负责,以便于各类大中小型企业(项目)能把精力关注在业务和应用上。
修好了
直接用肯定不行,用了 Array 类型字段,MySQL 没有,得把那部分改成 many to many 的关系
ActiveRecord 5 已经没这个问题了,callback 只有遇到 throws :abort
才能中断了。
#2 楼 @lilijreey 没读 Rails Guides,规则都在里面
此外,Gem 服务器的问题,请在 GitHub 提交,我能及时看到
看起来像 RPC 服务呀
#17 楼 @xhj6 这哪里是固步自封呀?什么地方体现出固步自封?我觉得应该是哪些人掌握了一套有效的解决方式、正确的工作模式持续坚持而已。你怎么知道哪些人没尝试过其他语言其他框架,其他的技术实现,你以为他们都傻么。
Rails 的思想是用简单有效的方式解决复杂的事情,Tubrolinks 的出现也不是拍脑门,而是确实能解决很多实在的问题,而且简单有效,Rails 的很多设计是希望整合实现,结合 Rails 已有的技术,避免重复开发相同的功能。
是的 Turbolinks 不是万能药,你不可能靠他实现所有项目,但在项目初期,甚至后期,你依然是可以用他实现很多功能的,然后它仅仅是 iOS 开发里面的一个小组件而已,有一天你的项目有时间有需要的时候,你可以逐步的把一些功能用 Native 实现(前提是你得有哪么多时间),Turbolinks(我指客户端的组件)仅仅是 iOS 里面一个对 WKWebView 的封装而已,它并没有破坏原有的 Native 架构,所以这个对于未来的 Native 实现是没有成本(或者说成本非常低的),当然也是相对 React Native、Ionic、RubyMotion 之类的架构方式。
所以为何不用呢?Turbolinks 能帮你项目起步的时候快速实现 iOS 功能,当然你要牛逼并且有时间有资金,你当然可以找几个 iOS 和 Android 工程师开发 Native 的 App。
还有一点是我认为 Turbolinks 还是更多的为 Rails 而设计的,只有 Rails 的项目用起来才会那么顺畅,我前面说到那些快速实现的基础是 Web 开发者得有熟练的 Rails 基础。
#28 楼 @jicheng1014 暂时不用,有赞助商的,你们多多支持 UpYun 和 腾讯云 好了
#25 楼 @jicheng1014 你这个问题解决了,是同步好了,但 Memcache 没有清理到位
app/views/layouts/application.html.erb 给 body 增加和 controller_name 有关的 class,例如:
<body data-controller-name="<%= controller_name %>">`
application.coffee 里面实现判断
if $('body').data('controller-name') in ['topics', 'replies']
// 初始化 topics 的 JS 代码
if $('body').data('controller-name') in ['pages']
// 初始化 pages 的 JS 代码
最后把 JS 都打包到一块儿加载。
静态文件可以靠 CDN,动态数据的话...我也想知道
我听说过很多公司的做法,把用户按区域划分,区域有区域独立的数据库,某个用户的活跃数据总是保存在哪个地区的本地服务器的,同步会有,但不是实时的。例如用户的账单、通知、个人文件之类的,这些只有他会看的,只需要放到他的附件的服务器。
#24 楼 @numbcoder 只能定时同步呀,两者选其一
Bug 已修复
我这几天都在反复调整,也是为了我方便,问题肯定会有,遇到了尽快告诉我,我抓紧调整就好了
谢谢提醒,之前只请求了 /specs.4.8 看没什么内容以为没东西,所以就缓存了。原来内容都在 /specs.4.8.gz 里面。
刚刚已经调整了一下配置,设置这个文件以及其他 *.4.8.gz 的文件缓存有效期 15 分钟。
$ curl -I https://gems-ruby-china.b0.upaiyun.com/specs.4.8.gz
HTTP/1.1 200 OK
Date: Tue, 09 Aug 2016 15:53:01 GMT
Content-Type: application/octet-stream
Content-Length: 2931016
Connection: keep-alive
X-Source: C/200
X-Proxy-Route: abroad, abroad
X-Amz-Replication-Status: PENDING
X-Served-By: cache-sea1925-SEA, cache-hkg6820-HKG
ETag: "10b0f11916651abcdff67d844ccdf0fa"
Last-Modified: Tue, 09 Aug 2016 15:46:09 GMT
X-Amz-Request-Id: B7B0BD79C77ED8F8
X-Cache-Hits: 3, 5
X-Amz-Meta-Surrogate-Key: full-index
X-Amz-Version-Id: bKe5TEe_iesHzrtnHXQNe44p3uc5.6hh
Accept-Ranges: bytes
Fastly-Debug-Digest: 0debb0ceabb31d16abb864478a5071786f8f67d8d7863ea1fe1be712493ee2ac
Age: 406
X-Amz-Id-2: nPgfOG/fK7ssxFUbJNTzOiduwZgU4XQCmCNSmfhXK0Lnc65w84v6zsQ6F6dQ+6yEjO7zZF30skQ=
Expires: Tue, 09 Aug 2016 16:08:01 GMT
Cache-Control: max-age=900
X-Shanks-Origin-Trace: abroad/transfer-abroad.upyun.com:404/200
X-Cache: MISS from mix-hz-fdi-166, MISS from ctn-sc-mei1-016
X-Request-Id: fedd3161abb5993e00168413fbdde101
Via: S.mix-hz-fdi-167, T.101163.M.1, V.mix-hz-fdi-166, T.12510.M.1, M.ctn-sc-mei1-016
@towonzhou @martin91 @ericguo @bianjp @acaby 你们现在再试试,去掉了 /api 的反向代理动作,改为由 bundler-api 在本地建立 API 数据库来实现。
现在速度能飞快了。
再试试,之前 Nginx 重启失败了,正确的配置没有生效