diff --git a/adapter/benchmark/pom.xml b/adapter/benchmark/pom.xml
new file mode 100644
index 0000000..ed56a11
--- /dev/null
+++ b/adapter/benchmark/pom.xml
@@ -0,0 +1,58 @@
+<!-- Licensed to the Apache Software Foundation (ASF) under one or more contributor
+	license agreements. See the NOTICE file distributed with this work for additional
+	information regarding copyright ownership. The ASF licenses this file to
+	You under the Apache License, Version 2.0 (the "License"); you may not use
+	this file except in compliance with the License. You may obtain a copy of
+	the License at http://www.apache.org/licenses/LICENSE-2.0 Unless required
+	by applicable law or agreed to in writing, software distributed under the
+	License is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS
+	OF ANY KIND, either express or implied. See the License for the specific
+	language governing permissions and limitations under the License. -->
+<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+  xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+  <parent>
+    <artifactId>rocketmq-eventbridge-adapter</artifactId>
+    <groupId>org.apache.rocketmq</groupId>
+    <version>1.0.0</version>
+    <relativePath>../pom.xml</relativePath>
+  </parent>
+
+  <modelVersion>4.0.0</modelVersion>
+
+  <artifactId>rocketmq-eventbridge-adapter-benchmark</artifactId>
+  <version>1.0.0</version>
+
+  <properties>
+    <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    <maven.compiler.source>8</maven.compiler.source>
+    <maven.compiler.target>8</maven.compiler.target>
+  </properties>
+
+
+  <dependencies>
+    <dependency>
+      <groupId>org.slf4j</groupId>
+      <artifactId>slf4j-api</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.projectlombok</groupId>
+      <artifactId>lombok</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.commons</groupId>
+      <artifactId>commons-lang3</artifactId>
+    </dependency>
+    <dependency>
+      <groupId>org.apache.rocketmq</groupId>
+      <artifactId>rocketmq-common</artifactId>
+      <version>5.1.1</version>
+    </dependency>
+    <dependency>
+      <groupId>junit</groupId>
+      <artifactId>junit</artifactId>
+      <version>4.11</version>
+      <scope>test</scope>
+    </dependency>
+  </dependencies>
+
+</project>
diff --git a/adapter/benchmark/src/main/java/org/apache/rocketmq/eventbridge/adapter/benchmark/AbstractEventCommon.java b/adapter/benchmark/src/main/java/org/apache/rocketmq/eventbridge/adapter/benchmark/AbstractEventCommon.java
new file mode 100644
index 0000000..ed6a91c
--- /dev/null
+++ b/adapter/benchmark/src/main/java/org/apache/rocketmq/eventbridge/adapter/benchmark/AbstractEventCommon.java
@@ -0,0 +1,74 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.adapter.benchmark;
+
+import org.apache.rocketmq.common.UtilAll;
+
+import java.io.File;
+import java.io.IOException;
+import java.io.LineNumberReader;
+import java.math.BigDecimal;
+import java.math.RoundingMode;
+import java.util.concurrent.ScheduledExecutorService;
+import java.util.concurrent.atomic.AtomicReference;
+import java.util.concurrent.atomic.LongAdder;
+
+public abstract class AbstractEventCommon {
+    protected File file;
+    protected LineNumberReader lineNumberReader;
+    protected AtomicReference<Integer> previousRowCount;
+    protected ScheduledExecutorService executorService;
+    protected LongAdder writeCount = new LongAdder();
+    protected LongAdder costTime = new LongAdder();
+
+    protected String twoDecimal(double doubleValue) {
+        BigDecimal bigDecimal = new BigDecimal(doubleValue).setScale(2, RoundingMode.HALF_UP);
+        return bigDecimal.toString();
+    }
+
+    protected void printStats() throws IOException {
+
+        int currentRowCount = getLineNumber();
+        if (previousRowCount.get() == null || previousRowCount.get() == 0) {
+            previousRowCount.set(currentRowCount);
+            return;
+        }
+
+        // tps: 每秒文件打印的行数
+        final long tps = currentRowCount - previousRowCount.get();
+        previousRowCount.set(currentRowCount);
+        writeCount.add(currentRowCount);
+        costTime.add(1000);
+        // delayTime（条/ms）=接收的数量/花费的时间
+        final double delayTime = writeCount.longValue() / costTime.longValue();
+        // String delayTimeStr = twoDecimal(delayTime);
+
+        String info = String.format("Current Time: %s  |  TPS: %d  ",
+                UtilAll.timeMillisToHumanString2(System.currentTimeMillis()), tps);
+
+        System.out.println(info);
+    }
+
+
+    public abstract void start();
+
+    protected int getLineNumber() throws IOException {
+        lineNumberReader.skip(Long.MAX_VALUE);
+        int lineNumber = lineNumberReader.getLineNumber();
+        return lineNumber;
+    }
+}
\ No newline at end of file
diff --git a/adapter/benchmark/src/main/java/org/apache/rocketmq/eventbridge/adapter/benchmark/EventTPSCommon.java b/adapter/benchmark/src/main/java/org/apache/rocketmq/eventbridge/adapter/benchmark/EventTPSCommon.java
new file mode 100644
index 0000000..e9acb87
--- /dev/null
+++ b/adapter/benchmark/src/main/java/org/apache/rocketmq/eventbridge/adapter/benchmark/EventTPSCommon.java
@@ -0,0 +1,75 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements.  See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ *  Unless required by applicable law or agreed to in writing, software
+ *  distributed under the License is distributed on an "AS IS" BASIS,
+ *  WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ *  See the License for the specific language governing permissions and
+ *  limitations under the License.
+ */
+package org.apache.rocketmq.eventbridge.adapter.benchmark;
+
+import org.apache.commons.lang3.concurrent.BasicThreadFactory;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+
+import java.io.*;
+import java.util.TimerTask;
+import java.util.concurrent.ScheduledThreadPoolExecutor;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.atomic.AtomicReference;
+
+/**
+ * 整条链路
+ */
+public class EventTPSCommon extends AbstractEventCommon {
+    public static void main(String[] args) {
+        String filePath = System.getProperty("user.home") + "/demo.eventbridge";
+        if (args.length > 0) {
+            filePath = args[0];
+        }
+        EventTPSCommon tpsCommon = null;
+        try {
+            tpsCommon = new EventTPSCommon(filePath);
+            tpsCommon.start();
+        } catch (FileNotFoundException e) {
+            e.printStackTrace();
+        } catch (IOException e) {
+            e.printStackTrace();
+        }
+    }
+
+    public EventTPSCommon(String filePath) throws FileNotFoundException {
+        init(filePath);
+    }
+
+    private void init(String filePath) throws FileNotFoundException {
+        file = new File(filePath);
+        lineNumberReader = new LineNumberReader(new FileReader(file));
+        previousRowCount = new AtomicReference<>();
+        previousRowCount.set(0);
+        executorService = new ScheduledThreadPoolExecutor(1,
+                new BasicThreadFactory.Builder().namingPattern("BenchmarkTimerThread-all-%d").build());
+    }
+
+    @Override
+    public void start() {
+        executorService.scheduleAtFixedRate(new TimerTask() {
+            @Override
+            public void run() {
+                try {
+                    printStats();
+                } catch (Exception e) {
+                    e.printStackTrace();
+                }
+            }
+        }, 1000, 1000, TimeUnit.MILLISECONDS);
+    }
+}
\ No newline at end of file
diff --git a/adapter/benchmark/src/test/java/org/apache/rocketmq/AppTest.java b/adapter/benchmark/src/test/java/org/apache/rocketmq/AppTest.java
new file mode 100644
index 0000000..4271fe4
--- /dev/null
+++ b/adapter/benchmark/src/test/java/org/apache/rocketmq/AppTest.java
@@ -0,0 +1,20 @@
+package org.apache.rocketmq;
+
+import static org.junit.Assert.assertTrue;
+
+import org.junit.Test;
+
+/**
+ * Unit test for simple App.
+ */
+public class AppTest 
+{
+    /**
+     * Rigorous Test :-)
+     */
+    @Test
+    public void shouldAnswerWithTrue()
+    {
+        assertTrue( true );
+    }
+}
diff --git a/adapter/pom.xml b/adapter/pom.xml
index 887be3e..dc61d42 100644
--- a/adapter/pom.xml
+++ b/adapter/pom.xml
@@ -27,6 +27,7 @@
         <module>rpc</module>
         <module>runtime</module>
         <module>storage</module>
+        <module>benchmark</module>
     </modules>
 
 </project>
\ No newline at end of file
