Skip to content

dvmonroe/qstash-ruby

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

5 Commits
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 

Repository files navigation

QStash

ci Maintainability

A Ruby client for the QStash service from Upstash.

QStash is an HTTP-based messaging and scheduling solution, designed for serverless and edge computing environments, guaranteeing at-least-once delivery.

If you're coming from a Rails background, you'll be familiar with ActiveJob, Sidekiq, and/or DelayedJob for background job processing. QStash can run background jobs which may/may not be a use case if you're using Ruby in a serverless environment but it's also much more than that. It can:

  • Schedule messages to be delivered at a later time.
  • Serve as a FIFO message queue.
  • Serve as a push based fanout exchange (think RabbitMQ).

Contents

Getting Started

Add this line to your application's Gemfile:

gem 'qstash'

Setup your thread safe configuration:

QStash.configure do |q|
  q.token = "your-qstash-token"
  q.url = "https://qstash.upstash.io"
end

or you can set the following ENV variables at runtime:

QSTASH_TOKEN=your-qstash-token
QSTASH_URL=https://qstash.upstash.io

Messages

Publish

To publish a message to a queue:

QStash::Message.publish(destination: "https://example.com/api/message-receiver", body: "Hello, World!")

From Upstash's docs:

Destination can either be a topic name or id that you configured in the Upstash console, a valid url where the message gets sent to, or a valid QStash API name like api/llm. If the destination is a URL, make sure the URL is prefixed with a valid protocol (http:// or https://)

You can also pass in headers. We help format Upstash's headers for you if you pass them in:

- "Upstash-Method",
- "Upstash-Timeout",
- "Upstash-Retries",
- "Upstash-Callback",
- "Upstash-Failure-Callback",
- "Upstash-Forward-*
- "Upstash-Delay",
- "Upstash-Not-Before",
- "Upstash-Deduplication-Id",
- "Upstash-Content-Based-Deduplication"
QStash::Message.publish(
  destination: "https://example.com/api/message-receiver",
  body: "Hello, World!",
  headers: { upstash_retries: 2 }
)

Enqueue

To enqueue a message to a queue:

QStash::Message.enqueue(
  queue_name: "my-queue",
  destination: "https://example.com/api/message-receiver",
  body: "Hello, World!"
)

Batch

To batch publish messages:

QStash::Message.batch_publish(messages: [
  {
    destination: "https://example.com/api/message-receiver",
    body: "Hello, World!"
  },
  {
    destination: "https://example.com/api/message-receiver",
    body: "Hello, World Again!",
    headers: { upstash_retries: 2 }
  }
])

Get

To get a message from a queue:

QStash::Message.get("1234") # 1234 is the message id

Cancel

To cancel a message from a queue:

QStash::Message.cancel("1234") # 1234 is the message id

Bulk Cancel

To bulk cancel messages from a queue:

QStash::Message.cancel(["1234", "5678"])

Events

List

To list all events:

QStash::Event.list

You can pass in any filters available from the Upstash docs.

QStash::Event.list(filters: {
  queueName: "my-queue",
  fromDate: Time.now - 1.day,
  toDate: Time.now
})

Signing Keys

Get

To get your current signing keys:

QStash::SigningKeys.get

Rotate

To rotate signing keys:

QStash::SigningKeys.rotate

Dead Letter Queue

Get

To get dead letter messages:

QStash::DLQ.get("1234") # 1234 is the dlq id of the message

List

To list dead letter messages:

QStash::DLQ.list

To list dead letter messages with filters:

QStash::DLQ.list(filters: {
  queueName: "my-queue", 
  fromDate: Time.now - 1.day, 
  toDate: Time.now 
})

Delete

To delete dead letter messages:

QStash::DLQ.delete("1234") # 1234 is the dlq id of the message

Delete Multiple

To delete multiple dead letter messages:

QStash::DLQ.delete(["1234", "5678"])

URL Groups

List

To list all url groups:

QStash::URLGroup.list

Add Endpoints

To add endpoints to a url group:

QStash::URLGroup.add_endpoints("my-url-group", endpoints: [{url: "https://example.com/api/message-receiver"}])

Note that this will create the url group if it doesn't already exist.

Delete Endpoints

To delete endpoints from a url group:

QStash::URLGroup.delete_endpoints("my-url-group", endpoints: [{url: "https://example.com/api/message-receiver"}])

Delete

To delete a url group:

QStash::URLGroup.delete("my-url-group")

Get

To get a url group:

QStash::URLGroup.get("my-url-group")

Development

After checking out the repo, run bin/setup to install dependencies. Then, run rake test to run the tests. You can also run bin/console for an interactive prompt that will allow you to experiment.

To install this gem onto your local machine, run bundle exec rake install.

Testing across all supported versions:

To run tests across all gem supported ruby versions (requires Docker):

bin/dev-test

To run lint across all gem supported ruby versions (requires Docker):

bin/dev-lint

Contributing

Bug reports and pull requests are welcome on GitHub at https://github.com/dvmonroe/qstash-ruby.

License

The gem is available as open source under the terms of the MIT License.

About

No description, website, or topics provided.

Resources

License

Stars

Watchers

Forks

Packages

No packages published