• SSO 是前提,不做SSO你也还是需要想办法做数据共享

    一般场景有两种,全栈 or 前后端分离,但都需要鉴权统一请求SSO

    • 全栈

      Java做Java的,Rails做Rails的,「提供另外一个系统的URL跳转」,通过跳转的方式进行切换,但是在用户体验上来说,浏览器页面始终在一个系统

    • 前后端分离

      前后端分离我知道的两种方式

      1. 前端控制,旧的系统页面不动,新的页面请求Rails API
      2. 流量转发,类似全栈的跳转,将指定规则的流量转到Rails API,使用一些工具如:Nginx

    题主随便建两个应用尝试一下应该就会有想法了💡


    😅 如有意见,还望轻喷 ...

  • obfuscate_id 管用,非常感谢

  • 很抱歉,看到大家的回答我才意识到自己的问题描述的非常差

    这个问题最重要的是在于转成Int的同时,数据已经被混淆

  • 非常感谢大家的积极回答,你们的每一个意见和建议对我都有或多或少的帮助

    最近有点少来了

    目前先用octopus

    能用,有点丑陋

    module CoreExt
      module ActiveRecord
        module ConnectionAdapters
          module ExecutionControl
            # 切换TiDB connection
            def tidb_conn
              ::ActiveRecord::Base.connection_proxy.current_shard = :tidb
              ::ActiveRecord::Base.connection_proxy
            end
    
            # 记录当前线程使用的connection,当切换tidb后,一直使用tidb
            def current_connection
              Thread.current['octopus.select_connection'] ||= :master
            end
    
            def current_connection=(shard_symbol)
              Thread.current['octopus.select_connection'] = shard_symbol
            end
    
            def execute(*args)
              # 只拦截 SELECT 并且是白名单内的
              return super unless args.first =~ /^SELECT/
              # 这里很蠢,用args.last的"Order Load"来判断当前select table
              return super unless WHITELIST.include?(args.last[0...-5])
              if ::ActiveRecord::Base.connection_proxy.current_shard == :master
                if self.current_connection == :master
                  result = super
                  return result if result.count > 0
                  self.current_connection = :tidb
                end
                result = tidb_conn.select_connection.execute(args.first, args.last)
              else
                result = super
                self.current_connection = :tidb
              end
              ::ActiveRecord::Base.connection_proxy.clean_connection_proxy
              result
            end
    
            private
            # 需要使用tidb的 table 名单
            WHITELIST = ["Order"...]
          end
        end
      end
    end
    
    ActiveRecord::ConnectionAdapters::Mysql2Adapter.include CoreExt::ActiveRecord::ConnectionAdapters::ExecutionControl
    

    这个贴先结了吧,有问题再重新开一个 再次感谢大家!!! 🙏 🙏 🙏

  • 用两种DB并不是为了处理冷热的场景而决定使用两种DB, 而是打算使用TiDB,属于试用阶段而考虑让冷数据先放TiDB

    proxy,目前是在研究的,我想的是proxy并非proxy db,毕竟目前还只是针对一个model

    至于你说过家家的方案,sorry,可能是我个人想出来的解决思路有点low

  • 数据已经分布好了,现在正解决如何不造成代码大量修改的情况下兼容分库查询

    目前做了一次在controller使用octopus手动切换查询的实验

    但这个有点痛苦,你得找出所有相关的controller,然后重复着 mysql 找不到去 Tidb

  • 分库是上级决定了

    目前 亿量级别的数据应该都会考虑把查询放在TiDB,Mysql保留热数据 update

    迁移TiDB还属于逐步迁移的过程,这个也是一次TiDB的实验,还不敢全动

  • 我一开始是打算把ActiveRecord:: Querying的所有方法都打上

    举个例子,这里使用了octopus进行切换数据源

    ...
      def self.all(*args)
        # mysql
        result = find(:all, args)
        return result if result.count > 0
        # mysql 不存在 去tidb
        # tidb
        using(:tidb).find(:all, args)
      end
    ...
    

    但,不一定能覆盖到所有的select sql

  • 一个 controller 可能会有很多直接调用查询或间接

    ActiveRecord 可能有 findfind_byalllastfirst...等等的产生select sql的方法

    如果给ActiveRecord的这些方法去打补丁,就需要给所有会产生select sql相关的方法都打上吗?

    请问,可以用什么方式可以挂在所有产生select 的方法上?

  • 很抱歉,很久没有上论坛了,没能及时回复。

    由于当时做的时候时间紧所以没有总结,很遗憾。

    我记得是用 axlsx 做的 axlsx + axlsx_rails 的gem结合,然后自己在后端导出时自定义标题然后遍历数据组装成一个xlsx

    导入时也一样,读取指定字段或者位置的数据进行组装。

    希望还能帮助到你!