Phoenix pubsub asterisk symbol support?

Let’s say we have a code

iex(1)> Phoenix.PubSub.subscribe Foo.PubSub, "user:*"
:ok
iex(2)> :erlang.process_info(self, :messages)
{:messages, []}
iex(3)> Phoenix.PubSub.broadcast Foo.PubSub, "user:1", :foo
:ok
iex(4)> :erlang.process_info(self, :messages)
{:messages, []}

Looks like phoenix_pubsub does not support asterisk symbol - "user:*" or "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 "user.*.currency.BTC.country.*"

1 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.

1 Like

@benwilson512

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

user.1.currency.*
user.*.currency.BTC

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:

user.1.currency.BTC
+
user.*.currency.*
+
user.1.currency.*
user.2.currency.*
user.3.currency.*

+
user.*.currency.BTC
user.*.currency.USD
user.*.currency.EUR

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.

1 Like