{"id":22511139,"url":"https://github.com/renderedtext/go-tackle","last_synced_at":"2025-04-14T11:32:04.458Z","repository":{"id":42124420,"uuid":"450462354","full_name":"renderedtext/go-tackle","owner":"renderedtext","description":"💯 reliable rabbitmq processor","archived":false,"fork":false,"pushed_at":"2025-02-20T14:43:38.000Z","size":88,"stargazers_count":0,"open_issues_count":1,"forks_count":2,"subscribers_count":4,"default_branch":"main","last_synced_at":"2025-03-28T00:44:04.593Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":null,"language":"Go","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/renderedtext.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null}},"created_at":"2022-01-21T11:17:44.000Z","updated_at":"2025-02-20T14:43:43.000Z","dependencies_parsed_at":"2025-03-28T00:40:47.492Z","dependency_job_id":"4d15c591-8525-4a1a-9d6b-45ee50bad5d3","html_url":"https://github.com/renderedtext/go-tackle","commit_stats":null,"previous_names":[],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renderedtext%2Fgo-tackle","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renderedtext%2Fgo-tackle/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renderedtext%2Fgo-tackle/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/renderedtext%2Fgo-tackle/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/renderedtext","download_url":"https://codeload.github.com/renderedtext/go-tackle/tar.gz/refs/heads/main","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":248871840,"owners_count":21175301,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":[],"created_at":"2024-12-07T02:09:14.753Z","updated_at":"2025-04-14T11:32:04.431Z","avatar_url":"https://github.com/renderedtext.png","language":"Go","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Tackle\n\nAn opinionated RabbitMQ message processing and publishing library, ideal\nfor async communicaton between microservices.\n\n## Installation\n\n```\ngo get github.com/renderedtext/go-tackle\n```\n\n## Publishing messages to a RabbitMQ exchange (simple)\n\nTo publish a message to a RabbitMQ exchange, use the `tackle.PublishMessage`\nfunction. For example, if you are writting a user managment service and want\nto publish that a user was created, use the following snippet.\n\n``` golang\npackage main\n\nimport (\n  tackle \"github.com/renderedtext/go-tackle\"\n)\n\nfunc main() {\n  publishParams := tackle.PublishParams{\n    Body:       []byte(`{\"user_id\": \"123\"}`),\n    RoutingKey: \"user-created\",\n    Exchange:   \"user-exchange\",\n    AmqpURL:    \"guest@localhost:5467\",\n  }\n\n  err := tackle.PublishMessage(\u0026publishParams)\n  if err != nil {\n    log.Info(\"something went wrong while publishing %v\", err)\n  }\n}\n```\n\n## Publishing messages to a RabbitMQ exchange (advanced)\n\nIn the simple publishing mechanism, tackle will open and close a connection\nevery time it sends a message. This is fine for sending one or two messages,\nhowever, if you plan to publish large batches of messages, it will be more\nefficient to create a dedicated publisher that keeps the connection open\nfor a longer duration.\n\n`tackle.NewPublisher` creates a publisher that will lazily create the connection,\nre-connecting if the current connection is closed for some reason.\n\n``` golang\npackage main\n\nimport (\n  tackle \"github.com/renderedtext/go-tackle\"\n)\n\nfunc main() {\n  publisher := tackle.NewPublisher(\"guest@localhost:5467\")\n  defer publisher.Close()\n\n  publishParams := tackle.PublishParams{\n    Body:       []byte(`{\"user_id\": \"123\"}`),\n    RoutingKey: \"user-created\",\n    Exchange:   \"user-exchange\",\n  }\n\n  err := publisher.PublishWithContext(context.Background(), \u0026publishParams)\n  if err != nil {\n    log.Info(\"something went wrong while publishing %v\", err)\n  }\n}\n```\n\n## Consuming messages from RabbitMQ\n\nTo consume messages from rabbit mq, you need to set up a consumer.\nHere is an example consumer for the above example messages:\n\n``` golang\npackage main\n\nimport (\n  tackle \"github.com/renderedtext/go-tackle\"\n)\n\nfunc main() {\n  consumer := tackle.NewConsumer()\n\n  options := tackle.Options{\n    URL:            \"amqp://guest:guest@rabbitmq:5672\",\n    RemoteExchange: \"user-exchange\",\n    Service:        \"user-persister\",\n    RoutingKey:     \"user-created\",\n  }\n\n  consumer.Start(\u0026options, func(delivery Delivery) {\n    fmt.Printf(\"Received message from the consumer: %s\", delivery.Body())\n\n    delivery.Ack()\n  })\n}\n```\n\nLet's break down what happens here: We are connecting to the remote exchange\n\"user-exchange\" and consuming those messages in our local \"user-persister\" \nqueue.\n\nVisually this looks like this:\n\n```\n+--------------------+\n| Publishing Service |\n+--------------------+\n       | \n       | Publish \n       | \"user-created\"\n       |           \n   +---|---RabbitMQServer-------------------------------------------------------+\n   |   v                                                                        |\n   | +---------------+                       * defined by publishing service *  |\n   | | user-exchange |                                                          |\n   | +---------------+                                                          |\n   |   |                                                                        |\n   |   | key = user-created                                                     |\n   |   |                                                                        |\n   |---|------------------------------------------------------------------------|\n   |   |                                                                        |\n   |   |                                     * defined by subscriber service *  |\n   |   v                                                                        |\n   |  +-------------------------+                                               |\n   |  | user-persister-exchange | \u003c-+                                           |\n   |  +------*------------------+   |                                           |\n   |         |                      | after N secs                              |\n   |         v                      |                                           |\n   |  +----------------+   +----------------------+    +--------------------+   |\n   |  | user-persister |   | user-persister-delay |    | user-perister-dead |   |\n   |  +------*---------+   +----------------------+    +--------------------+   |\n   |         |                               ^                 ^                |\n   +---------|-------------------------------|-----------------|----------------+\n             |                               |                 |\n             v                               |                 |\n       +-------------------+ ----(on err)----+                 |\n       | Consuming Service |                                   |\n       +-------------------+ ------------------- (after N err)-+\n```\n\n## License\n\nThis software is licensed under [the Apache 2.0 license](LICENSE).","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frenderedtext%2Fgo-tackle","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Frenderedtext%2Fgo-tackle","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Frenderedtext%2Fgo-tackle/lists"}