注:Media Driver对于Aeron的重要性参考:What is the Media Driver and why do I need it? - Aeron Cookbook
第一步:下载源码
下载源码(可能国内访问会有点儿慢,可考虑翻墙或拷贝到Gitee进行clone),建议git clone进行下载源码,其他下载方式可能不带有编译环境,导致后续流程执行报错:
git clone git@github.com:real-logic/aeron.git
第二步:切换到指定分支
# 进入到aeron目录
cd aeron
# 切换到指定版本分支,参考aeron cookbook,已非最新版本,但可靠(推荐master直接编译即可)
git checkout master
第三步:安装mac开发者工具(编译依赖)
xcode-select --install
第四步:安装cmake(编译C使用)
首先,需要提前安装brew(mac下,工程师理论上均需安装此工具,提供太多便利),参考:Mac安装brew的四种方法(指定能行)_mac brew-CSDN博客
另附解决brew install慢的参考方案:https://www.jianshu.com/p/6ea6e19c060d (如果有翻墙条件,此参考可忽略)
# 使用brew安装cmake
brew install cmake
第五步:编译C生成二进制可执行文件
因为国内网络限制,此步执行可能会各种报错,因此需提前调整gradle相关配置(若能利用翻墙,则可直接忽略修改gradle配置部分)
修改gradle-wrapper.properties:参考:解决Gradle下载过慢问题的有效方式:使用国内镜像站点-CSDN博客
# 首先搜索gradle-wrapper.properties
➜ aeron git:(master) find . -name "gradle*.properties"
# 修改此文件
./gradle/wrapper/gradle-wrapper.properties
./gradle.properties
# 修改./gradle/wrapper/gradle-wrapper.properties
➜ aeron git:(master) vim ./gradle/wrapper/gradle-wrapper.properties
# 将distributionUrl=https\://services.gradle.org/distributions/gradle-8.1.1-all.zip
# 修改为distributionUrl=https\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.1.1-all.zip
# 最终示例
distributionBase=GRADLE_USER_HOME
distributionPath=wrapper/dists
distributionUrl=https\://mirrors.aliyun.com/macports/distfiles/gradle/gradle-8.1.1-all.zip
networkTimeout=10000
zipStoreBase=GRADLE_USER_HOME
zipStorePath=wrapper/dists
修改build.gradle:
# 编辑修改build.gradle
➜ aeron git:(master) ✗ vim build.gradle
# 找到repositories进行修改
# 修改后示例
repositories {
// mavenLocal()
// mavenCentral()
maven { url 'https://maven.aliyun.com/repository/gradle-plugin' } //gradle-plugin
maven { url 'https://maven.aliyun.com/repository/google' } //google
maven { url 'https://maven.aliyun.com/repository/public' } //public
maven { url 'https://maven.aliyun.com/repository/jcenter'} //jcenter
}
然后执行:
./cppbuild/cppbuild
编译执行完成示例:
……
[ 99%] Built target archiveTest
[100%] Linking CXX executable ../../../../binaries/archiveTestW
[100%] Built target archiveTestW
Test project /Users/destiny/code/aeron/cppbuild/Release
Start 1: clientConductorTest
1/130 Test #1: clientConductorTest ........................ Passed 0.87 sec
Start 2: publicationTest
2/130 Test #2: publicationTest ............................ Passed 0.28 sec
Start 3: exclusivePublicationTest
3/130 Test #3: exclusivePublicationTest ................... Passed 0.56 sec
Start 4: imageTest
4/130 Test #4: imageTest .................................. Passed 0.29 sec
Start 5: fragmentAssemblerTest
5/130 Test #5: fragmentAssemblerTest ...................... Passed 0.30 sec
Start 6: imageFragmentAssemblerTest
6/130 Test #6: imageFragmentAssemblerTest ................. Passed 0.28 sec
Start 7: controlledFragmentAssemblerTest
7/130 Test #7: controlledFragmentAssemblerTest ............ Passed 0.27 sec
Start 8: imageControlledFragmentAssemblerTest
8/130 Test #8: imageControlledFragmentAssemblerTest ....... Passed 0.80 sec
Start 9: commandTest
9/130 Test #9: commandTest ................................ Passed 0.31 sec
Start 10: utilTest
10/130 Test #10: utilTest ................................... Passed 0.28 sec
Start 11: memoryMappedFileTest
11/130 Test #11: memoryMappedFileTest ....................... Passed 0.27 sec
Start 12: broadcastReceiverTest
12/130 Test #12: broadcastReceiverTest ...................... Passed 0.27 sec
Start 13: broadcastTransmitterTest
13/130 Test #13: broadcastTransmitterTest ................... Passed 0.28 sec
Start 14: concurrentTest
14/130 Test #14: concurrentTest ............................. Passed 1.21 sec
Start 15: countersManagerTest
15/130 Test #15: countersManagerTest ........................ Passed 0.28 sec
Start 16: termReaderTest
16/130 Test #16: termReaderTest ............................. Passed 0.28 sec
Start 17: termBlockScannerTest
17/130 Test #17: termBlockScannerTest ....................... Passed 0.26 sec
Start 18: termGapScannerTest
18/130 Test #18: termGapScannerTest ......................... Passed 0.55 sec
Start 19: termScannerTest
19/130 Test #19: termScannerTest ............................ Passed 0.27 sec
Start 20: manyToOneRingBufferTest
20/130 Test #20: manyToOneRingBufferTest .................... Passed 1.97 sec
Start 21: distinctErrorLogTest
21/130 Test #21: distinctErrorLogTest ....................... Passed 0.27 sec
Start 22: errorLogReaderTest
22/130 Test #22: errorLogReaderTest ......................... Passed 0.30 sec
Start 23: oneToOneRingBufferTest
23/130 Test #23: oneToOneRingBufferTest ..................... Passed 0.95 sec
Start 24: channelUriStringBuilderTest
24/130 Test #24: channelUriStringBuilderTest ................ Passed 0.26 sec
Start 25: channelUriTest
25/130 Test #25: channelUriTest ............................. Passed 0.27 sec
Start 26: cppSystemTest
26/130 Test #26: cppSystemTest .............................. Passed 0.77 sec
Start 27: bufferBuilderTest
27/130 Test #27: bufferBuilderTest .......................... Passed 0.27 sec
Start 28: atomicArrayUpdaterTest
28/130 Test #28: atomicArrayUpdaterTest ..................... Passed 16.09 sec
Start 29: array_to_ptr_hash_map_test
29/130 Test #29: array_to_ptr_hash_map_test ................. Passed 0.53 sec
Start 30: int64_to_ptr_hash_map_test
30/130 Test #30: int64_to_ptr_hash_map_test ................. Passed 0.27 sec
Start 31: int64_counter_map_test
31/130 Test #31: int64_counter_map_test ..................... Passed 0.26 sec
Start 32: int64_to_tagged_ptr_hash_map_test
32/130 Test #32: int64_to_tagged_ptr_hash_map_test .......... Passed 0.27 sec
Start 33: str_to_ptr_hash_map_test
33/130 Test #33: str_to_ptr_hash_map_test ................... Passed 0.27 sec
Start 34: bit_set_test
34/130 Test #34: bit_set_test ............................... Passed 0.36 sec
Start 35: atomic_test
35/130 Test #35: atomic_test ................................ Passed 0.27 sec
Start 36: spsc_rb_test
36/130 Test #36: spsc_rb_test ............................... Passed 1.58 sec
Start 37: mpsc_rb_test
37/130 Test #37: mpsc_rb_test ............................... Passed 4.37 sec
Start 38: broadcast_receiver_test
38/130 Test #38: broadcast_receiver_test .................... Passed 0.27 sec
Start 39: broadcast_transmitter_test
39/130 Test #39: broadcast_transmitter_test ................. Passed 0.27 sec
Start 40: distinct_error_log_test
40/130 Test #40: distinct_error_log_test .................... Passed 1.43 sec
Start 41: spsc_concurrent_array_queue_test
41/130 Test #41: spsc_concurrent_array_queue_test ........... Passed 1.19 sec
Start 42: mpsc_concurrent_array_queue_test
42/130 Test #42: mpsc_concurrent_array_queue_test ........... Passed 3.25 sec
Start 43: counters_test
43/130 Test #43: counters_test .............................. Passed 0.35 sec
Start 44: client_conductor_test
44/130 Test #44: client_conductor_test ...................... Passed 0.32 sec
Start 45: publication_test
45/130 Test #45: publication_test ........................... Passed 0.37 sec
Start 46: subscription_test
46/130 Test #46: subscription_test .......................... Passed 0.27 sec
Start 47: image_test
47/130 Test #47: image_test ................................. Passed 0.33 sec
Start 48: fragment_assembler_test
48/130 Test #48: fragment_assembler_test .................... Passed 0.27 sec
Start 49: image_fragment_assembler_test
49/130 Test #49: image_fragment_assembler_test .............. Passed 0.26 sec
Start 50: controlled_fragment_assembler_test
50/130 Test #50: controlled_fragment_assembler_test ......... Passed 0.33 sec
Start 51: controlled_image_fragment_assembler_test
51/130 Test #51: controlled_image_fragment_assembler_test ... Passed 0.27 sec
Start 52: aeron_fileutil_test
52/130 Test #52: aeron_fileutil_test ........................ Passed 0.29 sec
Start 53: uri_test
53/130 Test #53: uri_test ................................... Passed 0.27 sec
Start 54: version_test
54/130 Test #54: version_test ............................... Passed 0.27 sec
Start 55: bitutil_test
55/130 Test #55: bitutil_test ............................... Passed 0.27 sec
Start 56: deque_test
56/130 Test #56: deque_test ................................. Passed 0.27 sec
Start 57: fileutil_test
57/130 Test #57: fileutil_test .............................. Passed 0.29 sec
Start 58: math_test
58/130 Test #58: math_test .................................. Passed 0.27 sec
Start 59: strutil_test
59/130 Test #59: strutil_test ............................... Passed 0.65 sec
Start 60: error_test
60/130 Test #60: error_test ................................. Passed 0.31 sec
Start 61: netutil_test
61/130 Test #61: netutil_test ............................... Passed 0.28 sec
Start 62: symbol_table_test
62/130 Test #62: symbol_table_test .......................... Passed 0.28 sec
Start 63: http_util_test
63/130 Test #63: http_util_test ............................. Passed 0.27 sec
Start 64: systemTestW
64/130 Test #64: systemTestW ................................ Passed 0.82 sec
Start 65: systemTest
65/130 Test #65: systemTest ................................. Passed 0.80 sec
Start 66: pubSubTestW
66/130 Test #66: pubSubTestW ................................ Passed 10.06 sec
Start 67: pubSubTest
67/130 Test #67: pubSubTest ................................. Passed 10.14 sec
Start 68: countersTestW
68/130 Test #68: countersTestW .............................. Passed 0.71 sec
Start 69: countersTest
69/130 Test #69: countersTest ............................... Passed 0.68 sec
Start 70: imagePollTestW
70/130 Test #70: imagePollTestW ............................. Passed 1.33 sec
Start 71: imagePollTest
71/130 Test #71: imagePollTest .............................. Passed 1.39 sec
Start 72: localAddressesW
72/130 Test #72: localAddressesW ............................ Passed 0.67 sec
Start 73: localAddresses
73/130 Test #73: localAddresses ............................. Passed 0.93 sec
Start 74: multiDestinationCastW
74/130 Test #74: multiDestinationCastW ...................... Passed 2.00 sec
Start 75: multiDestinationCast
75/130 Test #75: multiDestinationCast ....................... Passed 2.24 sec
Start 76: livenessTimeoutTestW
76/130 Test #76: livenessTimeoutTestW ....................... Passed 1.00 sec
Start 77: livenessTimeoutTest
77/130 Test #77: livenessTimeoutTest ........................ Passed 1.06 sec
Start 78: responseChannelsTestW
78/130 Test #78: responseChannelsTestW ...................... Passed 0.71 sec
Start 79: responseChannelsTest
79/130 Test #79: responseChannelsTest ....................... Passed 0.73 sec
Start 80: exceptionsTestW
80/130 Test #80: exceptionsTestW ............................ Passed 0.26 sec
Start 81: channelUriStringBuilderTestW
81/130 Test #81: channelUriStringBuilderTestW ............... Passed 0.29 sec
Start 82: fragmentAssemblerTestW
82/130 Test #82: fragmentAssemblerTestW ..................... Passed 0.28 sec
Start 83: imageFragmentAssemblerTestW
83/130 Test #83: imageFragmentAssemblerTestW ................ Passed 0.27 sec
Start 84: controlledFragmentAssemblerTestW
84/130 Test #84: controlledFragmentAssemblerTestW ........... Passed 0.29 sec
Start 85: imageControlledFragmentAssemblerTestW
85/130 Test #85: imageControlledFragmentAssemblerTestW ...... Passed 0.40 sec
Start 86: counters_manager_test
86/130 Test #86: counters_manager_test ...................... Passed 0.26 sec
Start 87: driver_conductor_ipc_test
87/130 Test #87: driver_conductor_ipc_test .................. Passed 1.09 sec
Start 88: driver_conductor_network_test
88/130 Test #88: driver_conductor_network_test .............. Passed 2.13 sec
Start 89: driver_conductor_pub_sub_test
89/130 Test #89: driver_conductor_pub_sub_test .............. Passed 3.50 sec
Start 90: driver_conductor_spy_test
90/130 Test #90: driver_conductor_spy_test .................. Passed 1.31 sec
Start 91: driver_conductor_counter_test
91/130 Test #91: driver_conductor_counter_test .............. Passed 0.78 sec
Start 92: driver_conductor_clock_test
92/130 Test #92: driver_conductor_clock_test ................ Passed 0.48 sec
Start 93: driver_conductor_config_test
93/130 Test #93: driver_conductor_config_test ............... Passed 0.54 sec
Start 94: driver_conductor_subscribable_test
94/130 Test #94: driver_conductor_subscribable_test ......... Passed 0.65 sec
Start 95: driver_uri_test
95/130 Test #95: driver_uri_test ............................ Passed 1.88 sec
Start 96: udp_channel_test
96/130 Test #96: udp_channel_test ........................... Passed 0.28 sec
Start 97: term_scanner_test
97/130 Test #97: term_scanner_test .......................... Passed 0.27 sec
Start 98: loss_detector_test
98/130 Test #98: loss_detector_test ......................... Passed 0.26 sec
Start 99: retransmit_handler_test
99/130 Test #99: retransmit_handler_test .................... Passed 0.38 sec
Start 100: loss_reporter_test
100/130 Test #100: loss_reporter_test ......................... Passed 0.27 sec
Start 101: logbuffer_unblocker
101/130 Test #101: logbuffer_unblocker ........................ Passed 0.26 sec
Start 102: term_gap_filler_test
102/130 Test #102: term_gap_filler_test ....................... Passed 0.28 sec
Start 103: parse_util_test
103/130 Test #103: parse_util_test ............................ Passed 0.28 sec
Start 104: properties_test
104/130 Test #104: properties_test ............................ Passed 0.27 sec
Start 105: driver_configuration_test
105/130 Test #105: driver_configuration_test .................. Passed 0.52 sec
Start 106: driver_agent_test
106/130 Test #106: driver_agent_test .......................... Passed 4.76 sec
Start 107: udp_channel_transport_loss_test
107/130 Test #107: udp_channel_transport_loss_test ............ Passed 0.55 sec
Start 108: flow_control_test
108/130 Test #108: flow_control_test .......................... Passed 1.67 sec
Start 109: name_resolver_test
109/130 Test #109: name_resolver_test ......................... Passed 3.38 sec
Start 110: name_resolver_cache_test
110/130 Test #110: name_resolver_cache_test ................... Passed 0.27 sec
Start 111: data_packet_dispatcher_test
111/130 Test #111: data_packet_dispatcher_test ................ Passed 1.01 sec
Start 112: publication_image_test
112/130 Test #112: publication_image_test ..................... Passed 0.86 sec
Start 113: port_manager_test
113/130 Test #113: port_manager_test .......................... Passed 0.37 sec
Start 114: c_terminate_test
114/130 Test #114: c_terminate_test ........................... Passed 0.50 sec
Start 115: c_system_test
115/130 Test #115: c_system_test .............................. Passed 16.57 sec
Start 116: c_multi_destination_test
116/130 Test #116: c_multi_destination_test ................... Passed 1.52 sec
Start 117: c_local_addresses_test
117/130 Test #117: c_local_addresses_test ..................... Passed 1.28 sec
Start 118: c_errors_test
118/130 Test #118: c_errors_test .............................. Passed 7.28 sec
Start 119: c_cnc_test
119/130 Test #119: c_cnc_test ................................. Passed 1.75 sec
Start 120: congestion_control_test
120/130 Test #120: congestion_control_test .................... Passed 1.04 sec
Start 121: ipc_publication_test
121/130 Test #121: ipc_publication_test ....................... Passed 0.60 sec
Start 122: network_publication_test
122/130 Test #122: network_publication_test ................... Passed 0.64 sec
Start 123: timestamps_test_recvmmsg
123/130 Test #123: timestamps_test_recvmmsg ................... Passed 1.46 sec
Start 124: timestamps_test_recvmsg
124/130 Test #124: timestamps_test_recvmsg .................... Passed 1.49 sec
Start 125: position_test
125/130 Test #125: position_test .............................. Passed 0.26 sec
Start 126: driver_context_config_test
126/130 Test #126: driver_context_config_test ................. Passed 1.67 sec
Start 127: java_system_tests_c_media_driver
127/130 Test #127: java_system_tests_c_media_driver ........... Passed 242.70 sec
Start 128: archiveTest
128/130 Test #128: archiveTest ................................ Passed 15.00 sec
Start 129: archiveTestW
129/130 Test #129: archiveTestW ............................... Passed 13.82 sec
Start 130: aeronArchiveVersionTest
130/130 Test #130: aeronArchiveVersionTest .................... Passed 0.26 sec
100% tests passed, 0 tests failed out of 130
Total Test time (real) = 423.66 sec
如果编译构建不容易的情况下,最后看到全部Passed, 会有一种成功的喜悦😁😁😁
最后:运行Aeron's Media Driver(依赖此环境即可互相通信)
目录:/cppbuild/Release/binaries
./aeronmd -Daeron_print_configuration=true
# 运行示例
➜ binaries git:(master) ✗ ./aeronmd -Daeron_print_configuration=true
aeron_driver_context_t {
cnc_version=0.2.0
aeron_dir=/var/folders/zt/ws95snks5vx8wc80dw_4plhc0000gn/T/aeron-destiny
driver_timeout_ms=10000
print_configuration_on_start=1
dirs_delete_on_start=0
dirs_delete_on_shutdown=0
warn_if_dirs_exists=0
term_buffer_sparse_file=0
perform_storage_checks=1
spies_simulate_connection=0
reliable_stream=1
tether_subscriptions=1
rejoin_stream=1
receiver_group_consideration=2
to_driver_buffer_length=1049344
to_clients_buffer_length=1048704
counters_values_buffer_length=1048576
error_buffer_length=1048576
timer_interval_ns=1000000000
client_liveness_timeout_ns=10000000000
image_liveness_timeout_ns=10000000000
publication_unblock_timeout_ns=15000000000
publication_connection_timeout_ns=5000000000
publication_linger_timeout_ns=5000000000
untethered_window_limit_timeout_ns=5000000000
untethered_resting_timeout_ns=10000000000
retransmit_unicast_delay_ns=0
retransmit_unicast_linger_ns=10000000
nak_unicast_delay_ns=100000
nak_unicast_retry_delay_ratio=100
nak_multicast_max_backoff_ns=10000000
nak_multicast_group_size=10
status_message_timeout_ns=200000000
counter_free_to_reuse_ns=1000000000
conductor_cycle_threshold_ns=1000000000
sender_cycle_threshold_ns=1000000000
receiver_cycle_threshold_ns=1000000000
name_resolver_threshold_ns=5000000000
term_buffer_length=16777216
ipc_term_buffer_length=67108864
publication_window_length=0
ipc_publication_window_length=0
initial_window_length=131072
socket_sndbuf_length=0
socket_rcvbuf_length=131072
multicast_ttl=0
mtu_length=1408
ipc_mtu_length=1408
file_page_size=4096
low_file_store_warning_threshold=167772160
publication_reserved_session_id_low=-1
publication_reserved_session_id_high=1000
loss_report_length=1048576
send_to_sm_poll_ratio=6
receiver_io_vector_capacity=2
sender_io_vector_capacity=2
network_publication_max_messages_per_send=2
resource_free_limit=10
conductor_cpu_affinity_no=-1
receiver_cpu_affinity_no=-1
sender_cpu_affinity_no=-1
epoch_clock=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_epoch_clock)
nano_clock=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_nano_clock)
threading_mode=DEDICATED
agent_on_start_func=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_set_thread_affinity_on_start)
agent_on_start_state=0x7fb9b5008800
conductor_idle_strategy_func=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_idle_strategy_backoff_idle)
conductor_idle_strategy_init_args=0x0
sender_idle_strategy_func=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_idle_strategy_backoff_idle)
sender_idle_strategy_init_args=0x0
receiver_idle_strategy_func=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_idle_strategy_backoff_idle)
receiver_idle_strategy_init_args=0x0
shared_network_idle_strategy_func=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_idle_strategy_backoff_idle)
shared_network_idle_strategy_init_args=0x0
shared_idle_strategy_func=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_idle_strategy_backoff_idle)
shared_idle_strategy_init_args=0x0
unicast_flow_control_supplier_func=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_unicast_flow_control_strategy_supplier)
multicast_flow_control_supplier_func=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_max_multicast_flow_control_strategy_supplier)
receiver_group_tag.is_present=0
receiver_group_tag.value=100
flow_control.group_tag=-1
flow_control.group_min_size=0
flow_control_receiver_timeout_ns=5000000000
congestion_control_supplier_func=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_congestion_control_default_strategy_supplier)
usable_fs_space_func=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_usable_fs_space)
termination_validator_func=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_driver_termination_validator_default_deny)
termination_validator_state=0x0
termination_hook_func=(/Users/destiny/code/aeron/cppbuild/Release/binaries/aeronmd:termination_hook)
termination_hook_state=0x0
name_resolver_supplier_func=(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_default_name_resolver_supplier)
name_resolver_init_args=
resolver_name=
resolver_interface=
resolver_bootstrap_neighbor=
re_resolution_check_interval_ns=1000000000
sender_wildcard_port_range="0 0"
receiver_wildcard_port_range="0 0"
udp_channel_transport_bindings.media=default,0x104971fe0(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_udp_channel_transport_bindings_default)
conductor_udp_channel_transport_bindings.media=default,0x104971fe0(/Users/destiny/code/aeron/cppbuild/Release/lib/libaeron_driver.dylib:aeron_udp_channel_transport_bindings_default)
}
总结
- 若能翻墙进行搭建,相对较容易,参考aeron cookbook示例即可(Building the C Media Driver on macOS - Aeron Cookbook),也是首选方案,可以快速搭建完成,快速上手实践
- 国内环境需调整gradle相关配置进行编译构建
- 最后,aeron:Efficient reliable UDP unicast, UDP multicast, and IPC message transport.
1935

被折叠的 条评论
为什么被折叠?



