お仕事でEvent Meshを触る機会があったので自分でも触ってみようと思いました
わかりやすい説明とかは書けないのでこちらの記事を読んで頂くとだいたいのことはわかると思います(感謝)
また実務での利用イメージはこちらを見ていただくと良いかと思います。
S/4のBusinessPartnerが更新されるとEventMeshにMQTTプロトコルで連携がされてODataで見に行くようになっています。
今回の流れ
Node.jsのメッセージクライアントリポジトリがあるのでこちら使ってみます。
基本的にこちらの解説に従って進めていきます。
大きな流れとしては
1.準備
2.Queue Subscriptionsの確認
3.Webhook Subscriptionsの確認
準備
EventMeshのinstance作ったりServiceKeyの発行
上記のURLにも記載はありますがチュートリアルもあるのでこちらも参考に
コード準備
git clone https://github.com/SAP-samples/event-mesh-client-nodejs-samples.git
cd xb-msg-amqp-v100-samples
npm install
cf-sample-config.jsをServiceKeyに合わせて修正
{
"uaa": {
"credential-type": "binding-secret",
"clientid": "sb-clone-xbem-service-broker-63fe8d60c2a54ecf99b269e00ccbea62-clone!b40970|xbem-service-broker-!b732",
"clientsecret": "0c51cb83-e3a4-4b60-9814-1a588f5dde40$qNB4NPKpqsxQIzn6TxZf0UgrVob065IWlQjBAxolRYw=",
"xsappname": "clone-xbem-service-broker-63fe8d60c2a54ecf99b269e00ccbea62-clone!b40970|xbem-service-broker-!b732",
"url": "https://bb8713batrial.authentication.us10.hana.ondemand.com"
},
"xsappname": "clone-xbem-service-broker-63fe8d60c2a54ecf99b269e00ccbea62-clone!b40970|xbem-service-broker-!b732",
"management": [
{
"oa2": {
"clientid": "sb-clone-xbem-service-broker-63fe8d60c2a54ecf99b269e00ccbea62-clone!b40970|xbem-service-broker-!b732",
"clientsecret": "0c51cb83-e3a4-4b60-9814-1a588f5dde40$qNB4NPKpqsxQIzn6TxZf0UgrVob065IWlQjBAxolRYw=",
"tokenendpoint": "https://bb8713batrial.authentication.us10.hana.ondemand.com/oauth/token",
"granttype": "client_credentials"
},
"uri": "https://enterprise-messaging-hub-backend.cfapps.us10.hana.ondemand.com"
}
],
"serviceinstanceid": "63fe8d60-c2a5-4ecf-99b2-69e00ccbea62",
"messaging": [
{
"oa2": {
"clientid": "sb-clone-xbem-service-broker-63fe8d60c2a54ecf99b269e00ccbea62-clone!b40970|xbem-service-broker-!b732",
"clientsecret": "0c51cb83-e3a4-4b60-9814-1a588f5dde40$qNB4NPKpqsxQIzn6TxZf0UgrVob065IWlQjBAxolRYw=",
"tokenendpoint": "https://bb8713batrial.authentication.us10.hana.ondemand.com/oauth/token",
"granttype": "client_credentials"
},
"protocol": [
"amqp10ws"
],
"broker": {
"type": "sapmgw"
},
"uri": "wss://enterprise-messaging-messaging-gateway.cfapps.us10.hana.ondemand.com/protocols/amqp10ws"
},
{
"oa2": {
"clientid": "sb-clone-xbem-service-broker-63fe8d60c2a54ecf99b269e00ccbea62-clone!b40970|xbem-service-broker-!b732",
"clientsecret": "0c51cb83-e3a4-4b60-9814-1a588f5dde40$qNB4NPKpqsxQIzn6TxZf0UgrVob065IWlQjBAxolRYw=",
"tokenendpoint": "https://bb8713batrial.authentication.us10.hana.ondemand.com/oauth/token",
"granttype": "client_credentials"
},
"protocol": [
"mqtt311ws"
],
"broker": {
"type": "sapmgw"
},
"uri": "wss://enterprise-messaging-messaging-gateway.cfapps.us10.hana.ondemand.com/protocols/mqtt311ws"
},
{
"oa2": {
"clientid": "sb-clone-xbem-service-broker-63fe8d60c2a54ecf99b269e00ccbea62-clone!b40970|xbem-service-broker-!b732",
"clientsecret": "0c51cb83-e3a4-4b60-9814-1a588f5dde40$qNB4NPKpqsxQIzn6TxZf0UgrVob065IWlQjBAxolRYw=",
"tokenendpoint": "https://bb8713batrial.authentication.us10.hana.ondemand.com/oauth/token",
"granttype": "client_credentials"
},
"protocol": [
"httprest"
],
"broker": {
"type": "saprestmgw"
},
"uri": "https://enterprise-messaging-pubsub.cfapps.us10.hana.ondemand.com"
}
]
}
こんなJsonがあったら下記のように変えます。
今回はAMQPプロトコルで連携するのでそこのブロックの情報を持ってきます。
'use strict';
const fs = require('fs');
module.exports = {
uri: 'wss://enterprise-messaging-messaging-gateway.cfapps.us10.hana.ondemand.com/protocols/amqp10ws',
oa2: {
endpoint: 'https://bb8713batrial.authentication.us10.hana.ondemand.com/oauth/token',
client: 'sb-clone-xbem-service-broker-63fe8d60c2a54ecf99b269e00ccbea62-clone!b40970|xbem-service-broker-!b732',
secret: '0c51cb83-e3a4-4b60-9814-1a588f5dde40$qNB4NPKpqsxQIzn6TxZf0UgrVob065IWlQjBAxolRYw='
},
credentials: {
mechanism: '',
user: '',
password: ''
},
data: {
source: 'queue:SampleForAQueue',
target: 'topic:sample/for/a/topic',
payload: new Buffer.allocUnsafe(20),
maxCount: 100,
logCount: 10
}
};
cf-sample-config.jsに合わせてEventMeshのqueueとtopicを作成
Queue Subscriptionsの確認
producer.jsとconsumer.jsがあってproducer.jsはEventMeshに連携を飛ばして、それをconsumer.jsで使う構成になっています。
こちらのコマンドを実行するとproducer実行され100回メッセージが飛ばされます。
$ npm run-script producer
> @sap/xb-msg-amqp-v100-samples@1.0.0 producer
> node src/producer.js ../config/cf-sample-config.js
connected node-v12.22.7 @sap/xb-msg-amqp-v100 0.9.56
10
20
30
40
50
60
70
80
90
100
disconnected
messages published : 100
messages acknowledged : 100
websocket incoming : 10 frames ( small 5 / medium 5 / large 0 )
websocket outgoing : 9 frames ( small 6 / medium 3 / large 0 )
protocol incoming : 108 frames, 3681 bytes, 9 chunks
protocol outgoing : 107 frames, 10524 bytes, 8 chunks ( reuse 7 / alloc 3 )
drain events incoming : 0
drain events outgoing : 0
socket wait time[ms] : 0
socket init time[ms] : 3217
sender work time[ms] : 19
overall run time[ms] : 19
overall rate [msg/s] : 5263
Queuesが100回分溜まったことが確認できます。
次にconsumerを動かしてQueuesを消費していきます。
$ npm run-script consumer
> @sap/xb-msg-amqp-v100-samples@1.0.0 consumer
> node src/consumer.js ../config/cf-sample-config.js
connected node-v12.22.7 @sap/xb-msg-amqp-v100 0.9.56
10
20
30
40
50
60
70
80
90
100
disconnected
messages published : 100
websocket incoming : 10 frames ( small 4 / medium 6 / large 0 )
websocket outgoing : 12 frames ( small 7 / medium 5 / large 0 )
protocol incoming : 106 frames, 15048 bytes, 10 chunks
protocol outgoing : 106 frames, 5728 bytes, 11 chunks ( reuse 10 / alloc 3 )
drain events incoming : 0
drain events outgoing : 0
overall rate [msg/s] : 526
Queuesが消費されて0になったことが確認できます。
実務の実装ではproducer,consumerの役割を果たすアプリがあってその橋渡しをするのがEventMeshの役割かと思います。
Webhook Subscriptionsの確認
EventMeshにWebhook Subscriptionの設定を作成します。
Webhookの宛先はこちらを指定しています。
producerをもう一度実行してみます
$ npm run-script producer
> @sap/xb-msg-amqp-v100-samples@1.0.0 producer
> node src/producer.js ../config/cf-sample-config.js
connected node-v12.22.7 @sap/xb-msg-amqp-v100 0.9.56
10
20
30
40
50
60
70
80
90
100
disconnected
messages published : 100
messages acknowledged : 100
websocket incoming : 10 frames ( small 5 / medium 5 / large 0 )
websocket outgoing : 9 frames ( small 6 / medium 3 / large 0 )
protocol incoming : 108 frames, 3681 bytes, 9 chunks
protocol outgoing : 107 frames, 10524 bytes, 8 chunks ( reuse 7 / alloc 3 )
drain events incoming : 0
drain events outgoing : 0
socket wait time[ms] : 0
socket init time[ms] : 3217
sender work time[ms] : 19
overall run time[ms] : 19
overall rate [msg/s] : 5263
Queuesは0のままです。
webhookの連携先を確認してみます。
2回やったので合計200回のRequestが確認できました。
こうやって溜まったQueuesぶん指定されたURLをコールさせることが出来ます。
最後に
EventMeshを使うと非同期なシステム間の連携ができることが確認出来ました。
おしまい