slogan3

Help me een Ruby-script implementeren dat integreert met een berichtenwachtrijsysteem

description

Door een berichtenwachtrijsysteem te gebruiken, kan mijn toepassing asynchrone verwerking afhandelen, de fouttolerantie verbeteren en efficiënter schalen. Dit leidt tot betere prestaties en responsiviteit.

prompt

try_prompt

Ik heb hulp nodig bij het schrijven van een Ruby-script dat communiceert met een berichtenwachtrijsysteem, zoals RabbitMQ of Kafka. Geef aan welke berichtenwachtrij ik wil gebruiken: {{berichtwa ... more
generate_helper
disclaimerOnPageApi image_legal_disclaimer...

ai_answers

provider: openai
model: gpt-4.1-nano
Natuurlijk! Hier is een basisvoorbeeld van een Ruby-script dat communiceert met RabbitMQ, gebruikmakend van de `bunny`-gem. Het script laat zien hoe je berichten in JSON-formaat verzendt en ontvangt, met foutafhandeling en best practices. 1. Installeer eerst de benodigde gem: ```bash gem install bunny json ``` 2. Ruby-script voorbeeld: ```ruby require 'bunny' require 'json' # Configuratie RABBITMQ_URL = 'amqp://localhost' # Pas dit aan indien nodig QNAME = 'mijn_queue' # Verbinding maken met RabbitMQ begin connection = Bunny.new(RABBITMQ_URL) connection.start channel = connection.create_channel queue = channel.queue(QNAME, durable: true) rescue Bunny::Error => e puts "Fout bij verbinden met RabbitMQ: #{e.message}" exit 1 end # Verzenden van berichten def verzend_bericht(queue, data) begin json_data = data.to_json queue.publish(json_data, persistent: true) puts "Bericht verzonden: #{json_data}" rescue StandardError => e puts "Fout bij het verzenden van bericht: #{e.message}" end end # Ontvangen van berichten def ontvang_berichten(queue) begin puts "Wacht op berichten..." queue.subscribe(block: true, manual_ack: true) do |delivery_info, properties, payload| begin bericht = JSON.parse(payload) # Verwerk het bericht hier puts "Ontvangen bericht: #{bericht}" # Ack het bericht na succesvolle verwerking channel.ack(delivery_info.delivery_tag) rescue JSON::ParserError => e puts "Fout bij parseren van JSON: #{e.message}" # Doe geen ACK zodat het bericht opnieuw kan worden afgeleverd of verwerk anders channel.reject(delivery_info.delivery_tag, requeue: false) end end rescue Bunny::Error => e puts "Fout bij het ontvangen van berichten: #{e.message}" end end # Voorbeeld gebruik # Berichten verzenden data = { actie: 'verzend', inhoud: 'Hallo wereld' } verzend_bericht(queue, data) # Ontvangen berichten # ontvang_berichten(queue) # Sluit verbinding af bij afsluiten at_exit do connection.close if connection && connection.open? end ``` **Samenvatting van best practices:** - Gebruik `persistent: true` bij het publiceren voor duurzamere berichten. - Handhaaf foutafhandeling bij verbinding, verzenden en ontvangen. - Gebruik `manual_ack: true` en bevestig berichten na succesvolle verwerking. - Verwerk en parseer JSON-berichten veilig, met foutcontrole. - Sluit de verbinding netjes af bij afsluiten. Mocht je verdere aanpassingen wensen of hulp bij een specifiek onderdeel, laat het gerust weten!
provider: deepseek
model: deepseek-chat
Hier is een uitgebreid Ruby-voorbeeldscript voor RabbitMQ met JSON-berichten: ## Vereiste gem installeren ```bash gem install bunny ``` ## Ruby Script ```ruby require 'bunny' require 'json' require 'logger' class RabbitMQHandler def initialize(connection_params = {}) @connection_params = { host: 'localhost', port: 5672, user: 'guest', password: 'guest', vhost: '/' }.merge(connection_params) @logger = Logger.new(STDOUT) @connection = nil @channel = nil end def connect begin @connection = Bunny.new(@connection_params) @connection.start @channel = @connection.create_channel # Bevestigingsmodus inschakelen voor betrouwbare levering @channel.confirm_select @logger.info("Verbonden met RabbitMQ: #{@connection_params[:host]}") true rescue Bunny::TCPConnectionFailed => e @logger.error("Kan niet verbinden met RabbitMQ: #{e.message}") false rescue StandardError => e @logger.error("Onverwachte fout bij verbinden: #{e.message}") false end end def setup_queue(queue_name = 'task_queue', durable: true) begin queue = @channel.queue(queue_name, durable: durable) # Prefetch instellen voor eerlijke verdeling @channel.prefetch(1) @logger.info("Wachtrij '#{queue_name}' is klaar") queue rescue StandardError => e @logger.error("Fout bij opzetten wachtrij: #{e.message}") nil end end def publish_message(queue_name, message, persistent: true) return unless @channel begin queue = setup_queue(queue_name) # JSON-bericht valideren json_message = validate_and_serialize_json(message) return unless json_message properties = { persistent: persistent } queue.publish(json_message, properties) # Wacht op bevestiging van broker @channel.wait_for_confirms @logger.info("Bericht gepubliceerd naar '#{queue_name}': #{message}") true rescue Bunny::ConnectionClosedError => e @logger.error("Verbinding gesloten tijdens publiceren: #{e.message}") false rescue StandardError => e @logger.error("Fout bij publiceren bericht: #{e.message}") false end end def consume_messages(queue_name, &block) return unless @channel begin queue = setup_queue(queue_name) @logger.info("Wacht op berichten van '#{queue_name}'...") queue.subscribe(manual_ack: true, block: false) do |delivery_info, properties, body| begin # JSON-bericht parsen message = parse_json_message(body) if message # Verwerkingscallback aanroepen block.call(message) # Bevestig verwerking @channel.ack(delivery_info.delivery_tag) @logger.info("Bericht verwerkt: #{delivery_info.delivery_tag}") else # Afwijzen bij ongeldig JSON @channel.nack(delivery_info.delivery_tag) @logger.error("Ongeldig JSON-bericht afgewezen") end rescue StandardError => e @logger.error("Fout bij verwerken bericht: #{e.message}") # Bericht opnieuw in wachtrij plaatsen @channel.nack(delivery_info.delivery_tag, false, true) end end # Houd verbinding open sleep rescue StandardError => e @logger.error("Fout bij consumeren berichten: #{e.message}") end end def close begin @channel.close if @channel @connection.close if @connection @logger.info("Verbinding met RabbitMQ gesloten") rescue StandardError => e @logger.error("Fout bij sluiten verbinding: #{e.message}") end end private def validate_and_serialize_json(message) if message.is_a?(String) # Valideer of het geldige JSON is JSON.parse(message) message else JSON.generate(message) end rescue JSON::ParserError => e @logger.error("Ongeldig JSON-formaat: #{e.message}") nil end def parse_json_message(body) JSON.parse(body) rescue JSON::ParserError => e @logger.error("Kan JSON-bericht niet parsen: #{e.message}") nil end end # Gebruiksvoorbeeld if __FILE__ == $0 handler = RabbitMQHandler.new # Verbind met RabbitMQ unless handler.connect puts "Kan niet verbinden met RabbitMQ. Script stopt." exit 1 end # Voorbeeld: Bericht publiceren message_data = { id: SecureRandom.uuid, type: 'user_registration', timestamp: Time.now.iso8601, data: { user_id: 12345, email: 'gebruiker@voorbeeld.nl', name: 'Jan Jansen' } } # Publiceren handler.publish_message('user_events', message_data) # Consumeren (in aparte thread voor demo) Thread.new do handler.consume_messages('user_events') do |message| puts "Ontvangen bericht: #{message}" # Simuleer verwerking sleep(2) puts "Bericht verwerkt: #{message['id']}" end end # Wacht op interrupt signal begin loop { sleep 1 } rescue Interrupt puts "\nScript gestopt door gebruiker" ensure handler.close end end ``` ## Belangrijkste kenmerken: ### 1. **Foutafhandeling** - Verbindingsfouten - JSON parseerfouten - Berichtverwerkingsfouten - Netwerkfouten ### 2. **Beste praktijken** - **Bevestigingsmodus** voor betrouwbare levering - **Persistente berichten** om verlies te voorkomen - **Prefetch** voor eerlijke werklastverdeling - **Handmatige ACK/NACK** voor controle over verwerking - **Durable queues** om berichten niet te verliezen bij herstart ### 3. **JSON-bericht structuur** ```ruby { "id": "unieke-identifier", "type": "event_type", "timestamp": "2024-01-01T12:00:00Z", "data": { // applicatie-specifieke data } } ``` ### 4. **Uitvoering** ```bash ruby rabbitmq_handler.rb ``` Dit script biedt een robuuste basis voor RabbitMQ-integratie met juiste foutafhandeling en volgt industry best practices voor berichtverwerking.