• 首先,你确定你需要分库?所谓的高负载就是要分库么?你数据量有哪么大么?有多大,单表记录数量上亿了么?这活你收的钱上几十万、上百万了吗?


    不要想当然!


    或许有天是有可能有大么大数据量,这个时候你需要 找个 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 这样的一整套云服务目的就是为应用架构师服务的,那些背后复杂的服务器运维、数据库管理等工作让专业的人来独立负责,以便于各类大中小型企业(项目)能把精力关注在业务和应用上。

  • 修好了

  • #30 楼 @peter 我来修一下

  • Ruby China 能用 MySQL 吗? at August 16, 2016

    直接用肯定不行,用了 Array 类型字段,MySQL 没有,得把那部分改成 many to many 的关系

  • ActiveRecord 5 已经没这个问题了,callback 只有遇到 throws :abort 才能中断了。

    http://api.rubyonrails.org/classes/ActiveRecord/Callbacks.html#module-ActiveRecord::Callbacks-label-before_validation-2A+returning+statements

  • #2 楼 @lilijreey 没读 Rails Guides,规则都在里面

  • 此外,Gem 服务器的问题,请在 GitHub 提交,我能及时看到

    https://github.com/ruby-china/rubygems-mirror/issues

  • 看起来像 RPC 服务呀

  • 干掉你代码中的坏味道 at August 15, 2016

    #10 楼 @msg7086 居然 1.9.3 都不够

  • #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 基础。

  • ruby-china 的源有点慢 at August 12, 2016

    #28 楼 @jicheng1014 暂时不用,有赞助商的,你们多多支持 UpYun 和 腾讯云 好了

  • ruby-china 的源有点慢 at August 12, 2016

    #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,动态数据的话...我也想知道

    我听说过很多公司的做法,把用户按区域划分,区域有区域独立的数据库,某个用户的活跃数据总是保存在哪个地区的本地服务器的,同步会有,但不是实时的。例如用户的账单、通知、个人文件之类的,这些只有他会看的,只需要放到他的附件的服务器。

  • ruby-china 的源有点慢 at August 10, 2016

    #24 楼 @numbcoder 只能定时同步呀,两者选其一

  • Bug 已修复 😄

  • ruby-china 的源有点慢 at August 10, 2016

    我这几天都在反复调整,也是为了我方便,问题肯定会有,遇到了尽快告诉我,我抓紧调整就好了

  • ruby-china 的源有点慢 at August 10, 2016

    #21 楼 @bianjp 有延迟了,现在为了速度,是定时任务的…之前为了试试,全部代理,结果不理想

  • 谢谢提醒,之前只请求了 /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
    
  • ruby-china 的源有点慢 at August 09, 2016

    #19 楼 @bianjp 其实我还没搞太懂,这个要问 @qhwa 更熟悉一些

    我的实现方式是基于 bundle install 以及 gem install xxx 过程需要调用到的 API 来搞。

  • ruby-china 的源有点慢 at August 09, 2016

    #14 楼 @bianjp 错误已经解决了

  • ruby-china 的源有点慢 at August 08, 2016

    #16 楼 @bianjp 哦,哪个错误貌似不影响使用的,我在查查看是什么导致的

  • ruby-china 的源有点慢 at August 08, 2016

    #14 楼 @bianjp 执行的什么命令?

  • ruby-china 的源有点慢 at August 08, 2016

    @towonzhou @martin91 @ericguo @bianjp @acaby 你们现在再试试,去掉了 /api 的反向代理动作,改为由 bundler-api 在本地建立 API 数据库来实现。

    现在速度能飞快了。

  • 再试试,之前 Nginx 重启失败了,正确的配置没有生效