DEV Community

Cover image for Build reliable Slack apps
Qian Li
Qian Li

Posted on • Edited on

Build reliable Slack apps

Building a Slack app is fun! But is your app reliable?
While building one myself, I noticed two common issues in popular open-source Slack apps:

  1. Many apps process events synchronously, which can lead to timeouts. Slack expects responses within 3 seconds, but if your app triggers AI/RAG pipelines, then AI models may take longer to generate a reply (e.g., the new o1 model can take ~10 seconds to "think"). Slack’s best practices recommend queuing events and processing them asynchronously.

  2. Many apps don't handle duplicate events. If your app fails to respond, Slack retries the event three times. Without proper handling, retries can cause duplicate or inconsistent responses from the app. This leads to bad user experiences.

Here's how I solve them with DBOS Python, an open-source lightweight durable execution library. I started from an off-the-shelf AI/RAG-based Slack app demo (llamabot from LlamaIndex), lightly modified and annotated functions so each incoming message starts a DBOS workflow.

The message dispatch code is simple:

@slackapp.message()
def handle_message(request: BoltRequest) -> None:
    DBOS.logger.info(f"Received message: {request.body}")
    event_id = request.body["event_id"]
    # Use the unique event_id as an idempotency key to guarantee each message is processed exactly-once
    with SetWorkflowID(event_id):
        # Start the event processing workflow in the background then respond to Slack.
        # We can't wait for the workflow to finish because Slack expects the
        # endpoint to reply within 3 seconds.
        DBOS.start_workflow(message_workflow, request.body["event"])
Enter fullscreen mode Exit fullscreen mode
  1. The workflow is initiated in the background, allowing my app to respond to Slack quickly. DBOS workflows always run to completion once started (even running asynchronously). Thus, messages are always processed reliably.

  2. I use the message’s event ID as the workflow's idempotency key, so DBOS uses it to ensure each message is processed exactly once.

You can find more details about the AI-powered Slack app I built in this GitHub repo: https://github.com/dbos-inc/dbos-demo-apps/tree/main/python/llamabot

The README contains detailed instructions on how you could directly use this app in your Slack workspace.

How do you usually build reliable applications? Do you have any feedback for this app? Please let me know!

Top comments (2)

Collapse
 
vince_hirefunnel_co profile image
Vince Fulco (It / It's)

Great expert level perspective and tips.

Collapse
 
qianl15 profile image
Qian Li

Thank you for the kind words!