requeue وظيفة Sweatshop في Rabbitmq
-
18-09-2019 - |
سؤال
أنا أعمل على تطبيق القضبان حيث يتم تسليم المبالغ المستردة للعملاء إلى عامل sweatshop. إذا فشل استرداد الأموال (لأننا لا نستطيع الوصول إلى معالج الدفع في ذلك الوقت) أريد أن أطلب المهمة.
class RefundWorker < Sweatshop::Worker
def process_refund(job)
if refund
Transaction.find(job[:transaction]).update_attributes(:status => 'completed')
else
sleep 3
RefundWorker.async_process_refund(job) # requeue the job
end
end
هل هناك أي طريقة أفضل للقيام بذلك أكثر من أعلاه؟ لم أجد أي ميزة "تأخير" في Rabbitmq، وهذا هو أفضل الحلول التي وصلت إليها حتى الآن. أريد تجنب حلقة مشغول أثناء requeueing.
المحلول 3
لا يبدو أن AMQP (أو على الأقل أرنب) يدعم فكرة "تأخير هذه الوظيفة". لذلك فإن النهج لإعادة انتظار نفس المهمة من داخل العامل إذا فشل ذلك هو الحل الأفضل في هذا الوقت.
لدي التعليمات البرمجية التي تعمل في بيئة تجريبية وتلبي احتياجاتي حتى الآن.
نصائح أخرى
هل نظرت إلى أشياء مثل ruote و minion؟
بعض الروابط هنا: http://delicious.com/alexisrichardson/rabbitmq+work+ruby.
يمكنك أيضا تجربة الكرفس التي لا تتحدث RUBY الأصلية ولكن تتحدث HTTP + JSON.
كل ما سبق العمل مع الأرانب، لذلك قد يساعدك.
هتافات
الكسيس
لديك خدمة التسليم في الوقت المناسب؟ سترسل الرسالة لتسليمها كحميم، ملفوفة مع تسليم وقت واحد، وسوف تتمسك الخدمة بالرسالة حتى يتم الوصول إلى الوقت المحدد. لا يوجد شيء مثل هذا موجودا في خادم Rabbitmq أو أي من مكتبات عميل AMQP، بقدر ما أعرف، لكن سيكون من المفيد أن يكون لديك شيء مفيد.