Let’s say we have a code
iex(1)> Phoenix.PubSub.subscribe Foo.PubSub, "user:*"
iex(2)> :erlang.process_info(self, :messages)
iex(3)> Phoenix.PubSub.broadcast Foo.PubSub, "user:1", :foo
iex(4)> :erlang.process_info(self, :messages)
phoenix_pubsub does not support asterisk symbol -
"user.*" not worked for me. Is there any fundamental reason why it don’t support this functionality? Will be very useful for models/topics with big amount of fields (where amount of possible permutations is huge) like
@tim2CF it’s not supported because explicit support isn’t necessary, you can just publish to a
user:*" topic every time you call publish and voila, now you have support for that. Topics are simple strings with no implicit structure which allows you to handle any approach you want.
Let’s say we have some simple transaction ecto model with 2 fields (for simplicity of example) - user and currency. And we want notify process when transaction happens.
Process A wants to receive messages related to
user: 1 with any currency and process B wants to receive messages related to
currency: BTC and any user, so topics which they are listening will be
and when event with
user: 1 and
currency: BTC actually happens - I want just emit it once in my code with routing key
user.1.currency.BTC - but with current
phoenix_pubsub implementation message will not be delivered to A or B. To make it actually work I need to emit event multiple times with different keys:
Which obviously gives huge overhead even with amount of fields = 2. But with bigger amount of fields complexity and overhead becomes unacceptable.
What’s the overhead of splat matching? What’s the proposed mechanism for making that work that incurs less overhead?
I believe the ability to use the
* wildcard is a feature of Phoenix Channels, and not built into the PubSub system itself. When creating a channel you can tell Phoenix that you want a particular Channel module to handle all the broadcast messages matching a particular pattern, but I don’t think you can subscribe to a PubSub with wildcards.