rogerweb

rogerweb

How to acknowledge a Broadway message asynchronously?

Hi,

Scenario

I have a SQS queue with messages, each message is targeted to a specific user, each user joins his own Phoenix channel via websocket. I’m using Broadway to keep pulling the messages. In it’s handle_message/3 I use Phoenix’s broadcast/3 to push the message to the user:

Endpoint.broadcast("user:#{user_id}", "message", message)

I would like to make sure the user has received the message before I acknowledge it to Broadway/SQS.

Since the broadcast/3 doesn’t return the delivery result, I’m planning to make my JavaScript library to push an “ACK” back to the channel. I would include Broadway’s message_id in both messages.

The problem

How can I acknowledge the message to Broadway from the Phoenix’s channel handle_in/3?

As a side note, I started wondering if Broadway is the right tool for my use case, given the handle_message/3 documentation says:

Basically, any CPU bounded task that runs against a single message should be processed here.

but my task is more an I/O thing.

Any help is much appreciated.

First Post!

benwilson512

benwilson512

Author of Craft GraphQL APIs in Elixir with Absinthe

Yeah you probably want to do the broadcast in handle_batch because it would let you push a batch of messages from SQS to the end user, and then do a more efficient ACK back to SQS.

As far as getting the ACK from the client side, I think your only option is to block handle_batch until you get a message back from the client. Getting this ack back might be a bit tricky, perhaps you’ll have to have the broadway producer subscribe to an ack topic before pushing the messages out?

Last Post!

rogerweb

rogerweb

Yeah, I have no idea.

I was hoping Broadway could allow us to configure it to do not call handle_batch/4 automatically. Then I would call it myself once the last ACK arrives or times out.

Where Next?

Popular in Questions Top

vertexbuffer
Hello, can anybody help here..? I have a list of players and I what to delete an element, but every for loop the list is reverting to ori...
New
vonH
In asking this question I am more interested about the expressiveness of the language itself and less concerned about the availability of...
New
skosch
To my knowledge, put_in, Map.update etc. all have the one limitation of not automatically creating intermediate keys when needed (for exa...
New
ashish173
I am using Ecto timestamps with postgres, I can see the timestamps() use the :naive_dateime but for my use case I wanted to store the ti...
New
PeterCarter
There are pre-rolled solutions for other frameworks that do work. However, Phoenix does not seem to have these. Have people had good expe...
New
dokuzbir
I want to highlight html closing tags when i click a html tag. That works in .html files but doesnt work for html.eex templates. How can...
New
komlanvi
Hi everyone, I was playing with phoenix liveView but I run into an issue. I have a form and want to validate each input text when the te...
New

Other popular topics Top

KronicDeth
Elixir plugin for JetBrain’s IntelliJ Platform (including Rubymine) This is a plugin that adds support for Elixir to JetBrains IntelliJ...
289 36820 110
New
New
Brian
What is the proper way to load a module from a file in to IEX? In the python world, doing something like this pretty standard: from ....
New
gshaw
What is the idiomatic way of matching for not nil in Elixir? E.g., First way: defp halt_if_not_signed_in(conn, signed_in_account) when...
New
sen
Hi All, I set a environment variables in dev.exs , like below code. when i start server, how can i set the ${enable} value? thanks. d...
New
Harrisonl
We have an ECS cluster with 4 services, where each task joins a single cluster, via discovery ECS discovery service. Currently when I de...
New

We're in Beta

About us Mission Statement