Apache RocketMQ supports two styles of APIs to acknowledge messages once they are successfully processed.
Either of them is widely adopted by products. Per message acknowledgement simplifies SDK implementation while selective approach is more performant considering that fewer RPCs are required.
This SDK is built on top of gRPC. Protocol Buffers is used to serialize application messages.
Classes of this project are designed to be interface oriented. This paradigm makes dependency injection possible. DI is especially helpful when writing unit tests.
Generally, we follow Google C++ Code Style. A few exceptions are made to maintain API compatibility.
Considering SDK built on top of gRPC, ensure it is really necessary before introducing a third-party library. Check gRPC deps and gRPC extra deps first!
When introducing a third-party dependency or raising version of a dependency, make sure it is back-off friendly. For example,
if "com_google_googletest" not in native.existing_rules(): http_archive( name = "com_google_googletest", sha256 = "b4870bf121ff7795ba20d20bcdd8627b8e088f2d1dab299a031c1034eddc93d5", strip_prefix = "googletest-release-1.11.0", urls = [ "https://github.com/google/googletest/archive/refs/tags/release-1.11.0.tar.gz", ], )
Google Bazel is the primary build tool we supported, Please follow bazel installation guide.
Build From the workspace,
bazel build //...
Run Unit Tests From the workspace,
bazel test //...
Make sure you have installed a modern CMake 3.13+ and C++ compilation toolchain that at least supports C++11;
Following gRPC installation instructions to install grpc.
Note:
Remember to export MY_INSTALL_DIR=$HOME/grpc
as our primary CMakeLists.txt hints
list(APPEND CMAKE_PREFIX_PATH $ENV{HOME}/grpc)
If your grpc is installed somewhere else yet non-standard, please adjust accordingly.
When configure grpc, use your pre-installed system package if possible;
cmake -DCMAKE_INSTALL_PREFIX=$HOME/grpc -DgRPC_SSL_PROVIDER=package -DgRPC_ZLIB_PROVIDER=package
A few more options are involved. Check CMakeLists.txt of grpc
# Providers for third-party dependencies (gRPC_*_PROVIDER properties): # "module": build the dependency using sources from git submodule (under third_party) # "package": use cmake's find_package functionality to locate a pre-installed dependency set(gRPC_ZLIB_PROVIDER "module" CACHE STRING "Provider of zlib library") set_property(CACHE gRPC_ZLIB_PROVIDER PROPERTY STRINGS "module" "package") set(gRPC_CARES_PROVIDER "module" CACHE STRING "Provider of c-ares library") set_property(CACHE gRPC_CARES_PROVIDER PROPERTY STRINGS "module" "package") set(gRPC_RE2_PROVIDER "module" CACHE STRING "Provider of re2 library") set_property(CACHE gRPC_RE2_PROVIDER PROPERTY STRINGS "module" "package") set(gRPC_SSL_PROVIDER "module" CACHE STRING "Provider of ssl library") set_property(CACHE gRPC_SSL_PROVIDER PROPERTY STRINGS "module" "package") set(gRPC_PROTOBUF_PROVIDER "module" CACHE STRING "Provider of protobuf library") set_property(CACHE gRPC_PROTOBUF_PROVIDER PROPERTY STRINGS "module" "package") set(gRPC_PROTOBUF_PACKAGE_TYPE "" CACHE STRING "Algorithm for searching protobuf package") set_property(CACHE gRPC_PROTOBUF_PACKAGE_TYPE PROPERTY STRINGS "CONFIG" "MODULE") if(gRPC_BUILD_TESTS) set(gRPC_BENCHMARK_PROVIDER "module" CACHE STRING "Provider of benchmark library") set_property(CACHE gRPC_BENCHMARK_PROVIDER PROPERTY STRINGS "module" "package") else() set(gRPC_BENCHMARK_PROVIDER "none") endif() set(gRPC_ABSL_PROVIDER "module" CACHE STRING "Provider of absl library") set_property(CACHE gRPC_ABSL_PROVIDER PROPERTY STRINGS "module" "package")
Example programs uses gflags to parse command arguments. Please install it to $HOME/gflags as CMakeLists.txt has the following find package statements
# Assume gflags is install in $HOME/gflags list(APPEND CMAKE_PREFIX_PATH $ENV{HOME}/gflags) find_package(gflags REQUIRED)
OpenSSL development package is also required.
Run the following commands to build from ${YOUR_GIT_REPOSITORY}/cpp directory
mkdir build && cd build cmake -DOPENSSL_ROOT_DIR=/usr/local/Cellar/openssl@1.1/1.1.1q .. make -j $(nproc)
Static archive and dynamic linked libraries are found in the build directory.
All follow-up commands should run from the workspace directory.
Publish standard messages to your topic synchronously
bazel run //examples:example_producer -- --topic=YOUR_TOPIC --access_point=SERVICE_ACCESS_POINT --message_body_size=1024 --total=16
where 1024
is size of the message body to publish in bytes
Publish standard messages to your topic asynchronously
bazel run //examples:example_producer_with_async -- --topic=YOUR_TOPIC --access_point=SERVICE_ACCESS_POINT --message_body_size=1024 --total=16
where 1024
is size of the message body to publish in bytes
Publish FIFO messages to your topic
bazel run //examples:example_producer_with_fifo_message -- --topic=YOUR_TOPIC --access_point=SERVICE_ACCESS_POINT --message_body_size=1024 --total=16
where 1024
is size of the message body to publish in bytes
Publish transactional messages
bazel run //examples:example_producer_with_transactional_message -- --topic=YOUR_TOPIC --access_point=SERVICE_ACCESS_POINT --message_body_size=1024 --total=16
where 1024
is size of the message body to publish in bytes
Consume messages through Message Listener
bazel run //examples:example_push_consumer -- --topic=YOUR_TOPIC --access_point=SERVICE_ACCESS_POINT --group=YOUR_GROUP_ID
Consume messages through raw, atomic API
bazel run //examples:example_simple_consumer -- --topic=YOUR_TOPIC --access_point=SERVICE_ACCESS_POINT --group=YOUR_GROUP_ID
Visual Studio Code + Clangd is the recommended development toolset.
VSCode + Clangd
Clangd is a really nice code completion tool. Clangd requires compile_commands.json to work properly. To generate the file, we need clone another repository along with the current one.
git clone git@github.com:grailbio/bazel-compilation-database.git
From current repository root,
../bazel-compilation-database/generate.sh
Once the script completes, you should have compile_commands.json file in the repository root directory.
LLVM project has an extension for clangd. Please install it from the extension market.
The following configuration entries should be appended to your VSC settings file.
"C_Cpp.intelliSenseEngine": "Disabled", "C_Cpp.autocomplete": "Disabled", // So you don't get autocomplete from both extensions. "C_Cpp.errorSquiggles": "Disabled", // So you don't get error squiggles from both extensions (clangd's seem to be more reliable anyway). "clangd.path": "/Users/lizhanhui/usr/clangd_12.0.0/bin/clangd", "clangd.arguments": ["-log=verbose", "-pretty", "--background-index"], "clangd.onConfigChanged": "restart",
CLion + Bazel Plugin
Bazel also has a plugin for CLion.