On Saturday, March 23, 2019 at 4:59:07 PM UTC-7, [email protected]
wrote:
>
> So, I'm using sharding to provide multi-tenancy to my application with
> each customer getting their own database and a shared api pool that will
> listen to a message queue to add connections to the pool as new customers
> signup to prevent restarting the api servers. In my api, I do something
> like this:
>
> # connection initialization
> servers = {}
> # connect to configuration db and read tenant configs
> TENANT_DB = Sequel.connect(host: ...)
> TENANT_DB[:tenants_configs].each { |config| servers[config[:subdomain]] =
> { host: ... } }
> TENANT_DB.disconnect
> DB = Sequel.connect( { host: ... }, servers: servers, logger: logger )
>
> # around_action
> DB.with_server(subdomain.to_sym) do
> yield
> end
>
> # message consumer
> DB.add_server(host: ..., database: ..., user: ..., password: ...)
>
This doesn't look correct. The method would be DB.add_servers, and it
takes a hash keyed by the server symbols you want to add. I'm guessing you
would want something like this:
DB.add_servers(subdomain.to_sym => {host: ..., database: ..., user: ...,
password: ...})
You want to call that before calling DB.with_server(subdomain.to_sym),
though I'm not sure that is strictly required.
If the server was passed in during initialization, it works as expected,
> but using newly added server, the queries inside the with_server block are
> running against the default server. I was looking at using the arbitrary
> server extension as an alternative to what I'm encountering, but didn't
> like the thought of maintaining a global variable for all the "missing"
> configurations and not sure of potential performance issues using that
> approach. I'm not sure if I overlooked something or just not doing
> something incorrectly.
>
For an arbitrary number of customers, using separate servers for each may
eventually run into resource limits. You may want to use the
arbitrary_servers extension with the server_block extension in an
around_action (instead of using the add_servers approach), even though that
will require connecting and disconnecting from the database for each
request.
I'm guessing the reason it fell back to the default server is that is the
default way to handle unknown shards. See
http://sequel.jeremyevans.net/rdoc/files/doc/sharding_rdoc.html#label-Sharding
for a way to raise an error for unknown shards.
Thanks,
Jeremy
--
You received this message because you are subscribed to the Google Groups
"sequel-talk" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To post to this group, send email to [email protected].
Visit this group at https://groups.google.com/group/sequel-talk.
For more options, visit https://groups.google.com/d/optout.