ホームページ バックエンド開発 Python チュートリアル Pythonでメッセージキュー(RabbitMQ)を操作するチュートリアル

Pythonでメッセージキュー(RabbitMQ)を操作するチュートリアル

Jul 20, 2017 pm 03:34 PM
python 操作する 情報

RabbitMQ は、AMQP に基づいた完全で再利用可能なエンタープライズ メッセージング システムです。これは、Mozilla Public License オープンソース契約に従っています。以下の記事ではPythonを使ってメッセージキューRabbitMQを操作する方法を中心に紹介していますので、困っている方は参考にしてみてください。

はじめに

RabbitMQ は、AMQP に基づいた完全で再利用可能なエンタープライズ メッセージング システムです。これは、Mozilla Public License オープンソース契約に従っています。
MQ はメッセージ キュー (Message Queue) の略で、アプリケーション間の通信方法です。アプリケーションは、キューとの間でメッセージ (アプリケーション固有のデータ) を読み書きすることによって通信します。キューをリンクするための専用接続は必要ありません。メッセージングとは、プログラムが相互に直接呼び出しを行うのではなく、メッセージでデータを送信することによって相互に通信することを指します。これは通常、リモート プロシージャ コールなどの技術に使用されます。キューイングとは、キューを介して通信するアプリケーションを指します。キューを使用すると、受信アプリケーションと送信アプリケーションを同時に実行する必要がなくなります。

アプリケーションシナリオ:

RabbitMQ は間違いなく現在最も人気のあるメッセージキューの 1 つであり、さまざまな言語環境を豊富にサポートしています。.NET 開発者として、このツールを学習して理解する必要があります。メッセージキューの使用シナリオは大きく分けて 3 つあります:

1. システム統合と分散システム設計。さまざまなサブシステムがメッセージを介して接続され、このソリューションは徐々に「メッセージを通過するアーキテクチャ」というアーキテクチャ スタイルに発展しました。

2. ロギングなど、システム内の同期処理方法がスループットに重大な影響を与える場合。システム内のすべてのユーザー行動ログを記録する必要がある場合、ログを同期的に記録すると、ログ メッセージをメッセージ キューに送信するときに、ログ サブシステムがログ情報を非同期的に消費することになります。

3. 電子商取引のフラッシュセールシナリオなど、システムの高可用性。アプリケーションサーバーやデータベースサーバーが一定時間に大量のリクエストを受信すると、システムダウンが発生します。リクエストをメッセージ キューに転送でき、サーバーがこれらのメッセージを消費できる場合、リクエストはよりスムーズになり、システムの可用性が向上します。

1. インストール環境

まずLinuxにrabbitmqをインストールします


# 环境为CentOS 7
yum install rabbitmq-server # 安装RabbitMQ
systemctl start rabbitmq-server # 启动
systemctl enable rabbitmq-server # 开机自启
systemctl stop firewall-cmd  # 临时关闭防火墙
ログイン後にコピー

次に、pipを使用してPython3開発パッケージをインストールします


pip3 install pika
ログイン後にコピー

ソフトウェアをインストールした後、http: / /115.xx.xx.xx:15672/ 組み込み Web ページにアクセスして、RabbitMQ を表示および管理します。デフォルトの管理者ユーザーのパスワードは、guest

2. メッセージをキューに追加するだけです


#!/usr/bin/env python3
# coding=utf-8
# @Time : 2017/6/13 19:25
# @Author : Shawn
# @Blog : https://blog.just666.cn
# @Email : shawnbluce@gmail.com
# @purpose : RabbitMQ_Producer
import pika
# 创建连接对象
connection = pika.BlockingConnection(pika.ConnectionParameters(host='115.xx.xx.xx'))
# 创建频道对象
channel = connection.channel()
# 指定一个队列,如果该队列不存在则创建
channel.queue_declare(queue='test_queue')
# 提交消息
for i in range(10):
 channel.basic_publish(exchange='', routing_key='test_queue', body='hello,world' + str(i))
 print("sent...")
# 关闭连接
connection.close()
ログイン後にコピー

3. キューからメッセージを取得するだけです


#!/usr/bin/env python3
# coding=utf-8
# @Time : 2017/6/13 19:40
# @Author : Shawn
# @Blog : https://blog.just666.cn
# @Email : shawnbluce@gmail.com
# @purpose : RabbitMQ_Consumer
import pika
credentials = pika.PlainCredentials('guest', 'guest')
# 连接到RabbitMQ服务器
connection = pika.BlockingConnection(pika.ConnectionParameters('115.xx.xx.xx', 5672, '/', credentials))
channel = connection.channel()
# 指定一个队列,如果该队列不存在则创建
channel.queue_declare(queue='test_queue')
# 定义一个回调函数
def callback(ch, method, properties, body):
 print(body.decode('utf-8'))
# 告诉RabbitMQ使用callback来接收信息
channel.basic_consume(callback, queue='test_queue', no_ack=False)
print('waiting...')
# 开始接收信息,并进入阻塞状态,队列里有信息才会调用callback进行处理。按ctrl+c退出。
channel.start_consuming()
ログイン後にコピー

4.コンシューマがオフラインになったらどうなるでしょうか

次のような状況を想像してください:

コンシューマはメッセージ キューから n 個のデータを取得し、それを処理しようとしていますが、マシンがダウンしました。どうすればよいでしょうか。管理? RabbieMQ には、コンシューマ処理の終了を確認するために使用できる ACK があります。これは、ネットワークの ACK に似ています。コンシューマーがキューからデータを取得するたびに、キューはデータをすぐに削除せず、対応する ACK を待ちます。コンシューマーがデータを取得して処理を完了すると、ACK パケットをキューに送信して、メッセージが処理され削除できることを RabbitMQ に通知します。この時点で、RabbitMQ はキューからデータを削除します。したがって、この場合、コンシューマーがオフラインになっても問題はなく、データはキュー内に残り、他のコンシューマーが処理できるように残されます。

は、次のように Python で実装されます:

コンシューマには、確認パッケージを送信しないことを意味するコード行 channel.basic_consume(callback, queue='test_queue', no_ack=False) ,其中no_ack=False があります。これを no_ack=True に変更すると、各処理後に確認パケットが RabbitMQ に送信され、メッセージが処理されたことを確認します。

5. RabbitMQ がダウンしたらどうするか

ACK パケットはありますが、RabbitMQ がダウンするとデータは失われます。したがって、RabbitMQ 用のデータ永続ストレージをセットアップできます。 RabbitMQ はデータをディスク上に保持し、次回起動時にもキューが存在するようにします。

は Python で次のように実装されます:

我们声明一个队列是这样的channel.queue_declare(queue='test_queue') ,如果需要持久化一个队列可以这样声明channel.queue_declare(queue='test_queue', durable=True) 。不过这行直接放在代码中是不能执行的,因为以前已经有了一个名为test_queue的队列,RabbitMQ 不允许用不同的方式声明同一个队列,所以可以换一个队列名新建来指定数据持久化存储。不过如果只是这样声明的话,在 RabbitMQ 宕机重启后确实队列还在,不过队列里的数据就没有了。除非我们这样来声明队列channel.basic_publish(exchange='', routing_key="test_queue", body=message, properties=pika.BasicProperties(delivery_mode = 2,))

六、最简单的发布订阅

最简单的发布订阅在 RabbitMQ 中称之为Fanout模式。也就是说订阅者订阅某个频道,然后发布者向这个频道中发布消息,所有订阅者就都能接收到这条消息。不过因为发布者需要使用订阅者创建的随机队列所以需要先启动订阅者才能启动发布者。

发布者代码:


#!/usr/bin/env python3
# coding=utf-8
# @Time : 2017/6/13 20:21
# @Author : Shawn
# @Blog : https://blog.just666.cn
# @Email : shawnbluce@gmail.com
# @purpose : RabbitMQ_Publisher
import pika
# 创建连接对象
connection = pika.BlockingConnection(pika.ConnectionParameters(host='115.xx.xx.xx'))
# 创建频道对象
channel = connection.channel()
# 定义交换机,exchange表示交换机名称,type表示类型
channel.exchange_declare(exchange='my_fanout',
       type='fanout')
message = 'Hello Python'
# 将消息发送到交换机
channel.basic_publish(exchange='my_fanout', # 指定exchange
      routing_key='', # fanout下不需要配置,配置了也不会生效
      body=message)
connection.close()
ログイン後にコピー

订阅者代码:


#!/usr/bin/env python3
# coding=utf-8
# @Time : 2017/6/13 20:20
# @Author : Shawn
# @Blog : https://blog.just666.cn
# @Email : shawnbluce@gmail.com
# @purpose : RabbitMQ_Subscriber
import pika
credentials = pika.PlainCredentials('guest', 'guest')
# 连接到RabbitMQ
connection = pika.BlockingConnection(pika.ConnectionParameters('115.xx.xx.xx', 5672, '/', credentials))
channel = connection.channel()
# 定义交换机,进行exchange声明,exchange表示交换机名称,type表示类型
channel.exchange_declare(exchange='my_fanout',
       type='fanout')
# 随机创建队列
result = channel.queue_declare(exclusive=True) # exclusive=True表示建立临时队列,当consumer关闭后,该队列就会被删除
queue_name = result.method.queue
# 将队列与exchange进行绑定
channel.queue_bind(exchange='my_fanout',
     queue=queue_name)
# 定义回调方法
def callback(ch, method, properties, body):
 print(body.decode('utf-8'))
# 从队列获取信息
channel.basic_consume(callback,
      queue=queue_name,
      no_ack=True)
channel.start_consuming()
ログイン後にコピー

总结

以上がPythonでメッセージキュー(RabbitMQ)を操作するチュートリアルの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover

AI Clothes Remover

写真から衣服を削除するオンライン AI ツール。

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

中国語版、とても使いやすい

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

神レベルのコード編集ソフト(SublimeText3)

mysqlは支払う必要がありますか mysqlは支払う必要がありますか Apr 08, 2025 pm 05:36 PM

MySQLには、無料のコミュニティバージョンと有料エンタープライズバージョンがあります。コミュニティバージョンは無料で使用および変更できますが、サポートは制限されており、安定性要件が低く、技術的な能力が強いアプリケーションに適しています。 Enterprise Editionは、安定した信頼性の高い高性能データベースを必要とするアプリケーションに対する包括的な商業サポートを提供し、サポートの支払いを喜んでいます。バージョンを選択する際に考慮される要因には、アプリケーションの重要性、予算編成、技術スキルが含まれます。完璧なオプションはなく、最も適切なオプションのみであり、特定の状況に応じて慎重に選択する必要があります。

hadidb:pythonの軽量で水平方向にスケーラブルなデータベース hadidb:pythonの軽量で水平方向にスケーラブルなデータベース Apr 08, 2025 pm 06:12 PM

hadidb:軽量で高レベルのスケーラブルなPythonデータベースHadIDB(HadIDB)は、Pythonで記述された軽量データベースで、スケーラビリティが高くなっています。 PIPインストールを使用してHADIDBをインストールする:PIPINSTALLHADIDBユーザー管理CREATEユーザー:CREATEUSER()メソッド新しいユーザーを作成します。 Authentication()メソッドは、ユーザーのIDを認証します。 fromhadidb.operationimportuseruser_obj = user( "admin"、 "admin")user_obj。

MongoDBデータベースパスワードを表示するNAVICATの方法 MongoDBデータベースパスワードを表示するNAVICATの方法 Apr 08, 2025 pm 09:39 PM

Hash値として保存されているため、Navicatを介してMongoDBパスワードを直接表示することは不可能です。紛失したパスワードを取得する方法:1。パスワードのリセット。 2。構成ファイルを確認します(ハッシュ値が含まれる場合があります)。 3.コードを確認します(パスワードをハードコードできます)。

高負荷アプリケーションのMySQLパフォーマンスを最適化する方法は? 高負荷アプリケーションのMySQLパフォーマンスを最適化する方法は? Apr 08, 2025 pm 06:03 PM

MySQLデータベースパフォーマンス最適化ガイドリソース集約型アプリケーションでは、MySQLデータベースが重要な役割を果たし、大規模なトランザクションの管理を担当しています。ただし、アプリケーションのスケールが拡大すると、データベースパフォーマンスのボトルネックが制約になることがよくあります。この記事では、一連の効果的なMySQLパフォーマンス最適化戦略を検討して、アプリケーションが高負荷の下で効率的で応答性の高いままであることを保証します。実際のケースを組み合わせて、インデックス作成、クエリ最適化、データベース設計、キャッシュなどの詳細な主要なテクノロジーを説明します。 1.データベースアーキテクチャの設計と最適化されたデータベースアーキテクチャは、MySQLパフォーマンスの最適化の基礎です。いくつかのコア原則は次のとおりです。適切なデータ型を選択し、ニーズを満たす最小のデータ型を選択すると、ストレージスペースを節約するだけでなく、データ処理速度を向上させることもできます。

Python:主要なアプリケーションの調査 Python:主要なアプリケーションの調査 Apr 10, 2025 am 09:41 AM

Pythonは、Web開発、データサイエンス、機械学習、自動化、スクリプトの分野で広く使用されています。 1)Web開発では、DjangoおよびFlask Frameworksが開発プロセスを簡素化します。 2)データサイエンスと機械学習の分野では、Numpy、Pandas、Scikit-Learn、Tensorflowライブラリが強力なサポートを提供します。 3)自動化とスクリプトの観点から、Pythonは自動テストやシステム管理などのタスクに適しています。

Amazon AthenaでAWS接着クローラーの使用方法 Amazon AthenaでAWS接着クローラーの使用方法 Apr 09, 2025 pm 03:09 PM

データの専門家として、さまざまなソースから大量のデータを処理する必要があります。これは、データ管理と分析に課題をもたらす可能性があります。幸いなことに、AWS GlueとAmazon Athenaの2つのAWSサービスが役立ちます。

2時間のPython計画:現実的なアプローチ 2時間のPython計画:現実的なアプローチ Apr 11, 2025 am 12:04 AM

2時間以内にPythonの基本的なプログラミングの概念とスキルを学ぶことができます。 1.変数とデータ型、2。マスターコントロールフロー(条件付きステートメントとループ)、3。機能の定義と使用を理解する4。

MySQLはSQLサーバーに接続できますか MySQLはSQLサーバーに接続できますか Apr 08, 2025 pm 05:54 PM

いいえ、MySQLはSQL Serverに直接接続できません。ただし、次のメソッドを使用してデータ相互作用を実装できます。ミドルウェア:MySQLから中間形式にデータをエクスポートしてから、ミドルウェアを介してSQL Serverにインポートします。データベースリンカーの使用:ビジネスツールは、よりフレンドリーなインターフェイスと高度な機能を提供しますが、本質的にはミドルウェアを通じて実装されています。

See all articles