华为云用户手册

  • 参数描述 表1 结构体HwmRecvShareStateInfo参数说明 参数 类型 描述 state HwmState 共享状态。 name char[] 共享者名称。当state为HWM_STATE_ON时才有数据。 number char[] 共享者号码。当state为HWM_STATE_ON时才有数据。 表2 枚举HwmState说明 枚举值 描述 HWM_STATE_OFF 接收的共享已关闭。 HWM_STATE_ON 开始接收到共享。
  • 开发环境准备 在开发的过程中请满足如下环境要求。 表1 环境要求 环境和工具名称 版本要求 说明 操作系统 Windows 10/11专业版 硬件要求: CPU:i5-2400四核 3.1GHz及以上。 内存:4GB及以上。 Microsoft Visual Studio Visual Studio 2017 安装时需要勾选“使用 C++ 的桌面开发”,“用于 x86 和 x64 的 Visual C++ MFC”,“Windows 10 SDK (10.0.15063.0)” 测试资源及App ID申请 - 请参见“开发前准备”。
  • 参数描述 表1 结构体HwmShareStateInfo参数说明 参数 类型 描述 state HwmState 共享状态。 name char[] 共享者名称。当state为HWM_STATE_ON时才有数据。 number char[] 共享者号码。当state为HWM_STATE_ON时才有数据。 shareType HwmShareType 共享类型。 monitor HwmMonitor 共享显示器类型(主屏、副屏)。 appHandle HWND 程序句柄。 stopShareReason HwmStopShareReason 停止共享原因。 表2 枚举HwmState说明 枚举值 描述 HWM_STATE_OFF 共享已关闭。 HWM_STATE_ON 共享已开启。 表3 枚举HwmShareType说明 枚举值 描述 HWM_SHARE_TYPE_MONITOR 屏幕共享。 HWM_SHARE_TYPE_APP 程序共享。 HWM_SHARE_TYPE_WHITE_BOARD 白板共享。 表4 枚举HwmMonitor说明 枚举值 描述 HWM_MONITOR_MAIN 主显示器。 HWM_MONITOR_SECONDARY 副显示器。 表5 枚举HwmStopShareReason说明 枚举值 描述 HWM_STOP_SHARE_BY_NORMAL 正常停止共享。 HWM_STOP_SHARE_BY_REJOIN_CONF MMR迁移。
  • 参数描述 表1 结构体HwmCorpConfigInfo参数说明 参数 类型 描述 enablePstn bool 是否支持手机呼叫。 enableSms bool 是否支持短信通知。 enableRecord bool 是否支持会议录制。 allowGuestStartConf bool 是否允许来宾提前启动会议。 allowGuestStartConfTime unsigned int 允许来宾提前入会时间范围(单位:分钟) :0-随时,n-提前n分钟启动会议。 enableShowAddressBookStructure bool 是否支持通讯录显示。 corpEnableSummary bool 是否支持会议纪要。 corpEnableForbidScreenShots bool 是否支持禁止截屏。
  • StopShare 接口描述 该接口用于结束会中共享。SDK的UI已经实现了“停止共享”功能,如果第三方App不需要通过程序控制停止共享,则不用调用该接口。 注意事项 不在共享中不应调用此接口。 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode StopShare(); 回调函数 1 virtual void OnStopShareResult(hwmsdk::HwmErrCode ret, const char* reason) {}; 参数描述 无。 返回值 表1 返回值 类型 描述 HwmErrCode 成功返回0,其他值表示失败。失败返回值见错误码参考。 示例代码 1 2 3 4 5 6 7 8 9101112 /*** 结束共享*/void demoConfCtrlDlg::OnBnClickedButtonStopShare(){ //结束共享 int ret = hwmsdkagent::StopShare(); if (hwmsdk::HWM_COMMON_SUC CES S != ret) { AfxMessageBox(_T("StopShare error")); }}
  • 参数描述 表1 参数说明 参数 类型 描述 updateType HwmConflistUpdateType 更新类型。 confInfoList HwmConfListInfo* 会议列表参数信息。 confInfoLen unsigned int 会议列表参数信息的长度。 表2 枚举HwmConflistUpdateType说明 枚举值 描述 CONFLIST_UPDTAE_ALL 会议列表全量更新。 CONFLIST_UPDATE_ADD 会议列表有增加或者修改。编辑会议导致会议列表变更会上报该值。 CONFLIST_UPDATE_DELETE 会议列表有删除。 表3 结构体HwmConfListInfo参数说明 参数 类型 描述 confId char[] 会议ID。 confSubject char[] 会议主题。 chairmanPwd char[] 主持人密码。 guestPwd char[] 来宾密码。 audiencePwd char[] 观众密码。 startTimeStamp long long 会议开始时间,UTC时间戳,精度秒。 endTimeStamp long long 会议结束时间,UTC时间戳,精度秒。 timeZone char[] 时区码 mediaType HwmMediaType 媒体类型 表2。 scheduserName char[] 会议预定者名称。 vmrConferenceId char[] 用于云会议显示的ID。 chairJoinUri char[] 主持人加入会议uri链接 guestJoinUri char[] 来宾加入会议uri链接 audienceJoinUri char[] 观众加入会议的链接 confStateType HwmConfState 会议状态 isWebinar bool 是否是网络研讨会 selfConfRole HwmConfRole 本人在会议中的角色表5。 customInfo char[] 自定义扩展信息 表4 枚举HwmConfState说明 枚举值 描述 HWM_CONF_STATE_SCHEDULE 预定状态。 HWM_CONF_STATE_CREATING 正在创建状态。 HWM_CONF_STATE_GOING 会议已经开始。 HWM_CONF_STATE_DESTROYED 会议已经关闭
  • JoinConfByRandom 接口描述 通过邮件会议通知中的会议链接入会时(会议链接如:https://bmeeting.huaweicloud.com/#/j/981924330/e11ddec62ee760734fcf2ba55b79937eac2aa68677caf659),链接里面的是会议ID(即举例中的981924330)和会议的Random码(即举例中的e11ddec62ee760734fcf2ba55b79937eac2aa68677caf659)。第三方App需要调用本接口加入会议。 如果预约会议时选择没有来宾密码,会议链接只有会议ID,没有Random码。 注意事项 在登录和未登录状态下都可以调用该接口。 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode JoinConfByRandom(HwmJoinConfByRandomInfo *joinConfByRandomInfo); 回调函数 1 virtual void OnJoinConfByRandomResult(hwmsdk::HwmErrCode ret, const char* reason) {}; 参数描述 表1 结构体HwmJoinConfByRandomInfo参数说明 参数 是否必须 类型 描述 confId 是 char[] 会议ID。 random 否 char[] 48位会议密码映射值。来源于分享会议信息中的会议链接尾部。会议不要求来宾密码时,可以为空字符串。 name 否 char[] 会议昵称。在已登录状态下可为空,已登录时为空将使用登录的用户名作为会场名。匿名入会必须传该名字或者提前设置会场名。 domain 否 char[] 域名 。离线入会时使用。 isCloseSpk 否 bool 是否关闭扬声器,true关闭扬声器;false不关闭扬声器。 返回值 表2 返回值 类型 描述 HwmErrCode 成功返回0,其他值表示失败。失败返回值见错误码参考。 示例代码 1 2 3 4 5 6 7 8 9101112131415161718 // 通过会议ID和Random加入会议int demoJoinConfByRandomDlg::clickJoinConfByRandom(){ // 填写会议ID和密码映射值等;Random入会时,支持配置会场名称 hwmsdkagent::HwmJoinConfByRandomInfo data; memset(&data, 0, sizeof(hwmsdkagent::HwmJoinConfByRandomInfo)); strncpy_s(data.confId, GetMeetingID().c_str(), HWM_MAX_CONF_ID_LEN); strncpy_s(data.random, GetAccessCode().c_str(), HWM_MAX_RANDOM_LEN); strncpy_s(data.name, GetParticipantName().c_str(), HWM_MAX_DISPLAY_NAME_LEN); data.isCloseSpk = false; // 设置麦克风和摄像头开关 int ret = EnableFeature(hwmsdkagent::HWM_ENABLE_FEATURE_TYPE_MIC_SWITCH, true); ret = EnableFeature(hwmsdkagent::HWM_ENABLE_FEATURE_TYPE_CAM_SWITCH, false); ret = hwmsdkagent::JoinConfByRandom(&data); return ret;} 在加入会议前可通过调用EnableFeature修改麦克风、摄像头状态。
  • SetWaterMark 接口描述 该接口用于设置水印自定义内容注入,若未进行设置,将默认使用内部优先级来展示水印内容。 图1 自定义水印 注意事项 该接口必须在会前调用,会中调用不会即时生效。 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。 企业级水印开关未打开的场景下,水印自定义内容注入也不会生效。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode SetWaterMark(const HwmWaterMarkInfo * wtInfo); 回调函数 1 virtual void OnSetWaterMarkInjectInfoResult(hwmsdk::HwmErrCode ret, const char* reason) {}; 参数描述 表1 参数说明 参数 是否必须 类型 描述 wtInfo 是 HwmWaterMarkInfo 设置水印注入信息。 表2 结构体HwmWaterMarkInfo参数说明 参数 类型 描述 content char[] 设置用户自定义水印注入内容。 color HwmWaterMarkColorType 设置水印字体颜色。 表3 枚举HwmWaterMarkColorType说明 枚举值 描述 HWM_WATERMARK_COLOR_TYPE_LIGHT 浅色 #CCCCCC。 HWM_WATERMARK_COLOR_TYPE_STANDARD 标准色 #999999。 HWM_WATERMARK_COLOR_TYPE_DARKER 深色 #666666。 返回值 表4 返回值 类型 描述 HwmErrCode 成功返回0,其他值表示失败。失败返回值见错误码参考。 示例代码 1 2 3 4 5 6 7 8 910111213141516 /*** 设置水印*/void demoWaterMarkInfoDlg::OnBnClickedSetWaterMarkInjectInfo(){ unsigned int color = hwmsdkagent::HWM_WATERMARK_COLOR_TYPE_LIGHT; hwmsdkagent::HwmWaterMarkInfo injectInfo = {0}; strncpy_s(injectInfo.content, GetContent().c_str(), HWM_MAX_WATERMARK_CONTENT_LEN); injectInfo.color = (hwmsdkagent::HwmWaterMarkColorType)color; int ret = hwmsdkagent::SetWaterMark(&injectInfo); if (hwmsdk::HWM_COMMON_SUCCESS != ret) { AfxMessageBox(_T("SetWaterMark inject info failed")); }}
  • Config 接口描述 Windows SDK中已经提供了会议中的界面,界面上的部分元素是可以自定义的。可以自定义的界面元素如下: 会议窗口名称 会议开始后,在Windows任务栏上会生成一个会议的图标,鼠标指向该图标时会显示会议的缩略窗口,该窗口的名称可以自定义。 图1 会议窗口名称 会议窗口的图标,可以替换HwmSdk\sdkResources\nativeimg目录下的video.ico图标文件。 会议信息及会议链接前缀 会议链接的域名前缀默认是https://bmeeting.huaweicloud.com/(如https://bmeeting.huaweicloud.com/#/j/982989574),如果入会Portal是第三方自己开发的,这个前缀需要自定义。 整个会议信息也可以自定义显示或者隐藏。 图2 会议信息 来电窗口 会议来电窗口默认在收到来电时弹出,可配置成隐藏,在收到来电通知时调用会议来电应答接口来应答: 图3 来电窗口 会控按钮 删除或者修改SDK中自带的会控按。具体可以删除和修改的按钮见按钮ID定义表。 自定义新增按钮。具体用例见自定义会控按钮。 图4 底部工具栏和更多菜单 图5 共享工具栏和更多菜单 图6 自定义子菜单项: 自定义会议信息窗口 图7 自定义会议信息框 图8 状态工具栏 图9 与会者详情头像点击 自定义会议信息窗口请参考“显示会议信息框”和“销毁会议信息框”。 注意事项 只有需要更改会议界面默认显示样式时,才需要调用该接口,若默认样式已满足要求,可以不调用该接口。 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode Config(char uiConfig[HWM_MAX_CONFIG_LEN]);
  • 参数描述 表1 结构体HwmConfInfo参数说明 参数 类型 描述 url char[] 当前会议链接,可以分享通过浏览器打开进行入会。 confId char[] 会议id。 role HwmConfRole 会议角色。主持人、普通与会者等。 chairmanPwd char[] 会议主持人密码。 generalPwd char[] 会议来宾密码。 subject char[] 会议主题。 isOtherCorpConf bool 是否是外部企业的会议。如果是加入外部企业的会议或者匿名入会是true,否则是false。 isCreator bool 是否是会议预订者。 isInBreakoutSubConf bool 是否在讨论组中。 customInfo char[] 自定义扩展信息 表2 枚举HwmConfRole说明 枚举值 描述 HWM_CONF_ROLE_ATTENDEE 普通与会者。 HWM_CONF_ROLE_CHAIRMAN 主持人。 HWM_CONF_ROLE_AUDIENCE 观众。 HWM_CONF_ROLE_COHOST 联席主持人。 HWM_CONF_ROLE_WAITING 等候室成员。
  • GetVmrList 接口描述 该接口用于获取VMR列表。 注意事项 该接口在已登录状态下才能调用。 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode GetVmrList(); 回调函数 该接口已废弃,请参考新回调OnGetVmrInfoListResult 1 virtual void OnGetVmrListResult(hwmsdk::HwmErrCode ret, const char* reason, const HwmVmrInfo* vmrInfoList, unsigned int listLen) {}; 新回调 1 virtual void OnGetVmrInfoListResult(hwmsdk::HwmErrCode ret, const char* reason, const HwmVmrListInfo* vmrListInfo) {}; 参数描述 无。 返回值 表1 返回值 类型 描述 HwmErrCode 成功返回0,其他值表示失败。失败返回值见错误码参考。 表2 结构体HwmVmrInfo参数说明 参数 类型 描述 vmrConferenceId char[] 云会议室上的固定会议ID。 vmrId char[] 云会议室唯一ID。 chairmanPwd char[] 云会议室主持人密码。 guestPwd char[] 云会议室来宾密码。 type HwmVmrIdType 云会议室类型。 maxParties int 云会议室最大方数。 name char[] 会议室名称。 allowGuestStartConf bool 是否允许来宾提前启动会议。 joinConfRestrictionType HwmJoinConfPermissionType 允许入会范围限制。 isOpenWaitingRoom bool 等候室开启开关。 表3 枚举HwmVmrIdType说明 枚举值 描述 PERSONAL_MEETING_ID 个人会议ID。 CLOUD_MEETING_ROOM_ID 云会议室ID。 表4 结构体HwmVmrListInfo参数说明 参数 类型 描述 numOfVmrs unsigned int 云会议室个数。 vmrs HwmVmrInfo 云会议室信息。 isEnableShareVmr bool 是否开启共享vmr。 示例代码 1 2 3 4 5 6 7 8 91011 /*** 获取Vmr列表*/void demoBookConfDlg::GetVmrList(){ int ret = hwmsdkagent::GetVmrList(); if (hwmsdk::HWM_COMMON_SUCCESS != ret) { AfxMessageBox(_T("GetVmrList error")); }}
  • 常见错误码 表1 HwmErrCode枚举说明 变量 值 描述 HWM_COMMON_ERR_FAILED 1 通用错误。 HWM_COMMON_ERR_PA RAM _ERROR 2 参数错误。 HWM_ LOG IN_ERR_ACCOUNT_OR_PASSWORD_ERROR 10006 账号或密码错误。 HWM_LOGIN_ERR_ACCOUNT_LOCKED 10007 账号被锁定。 HWM_LOGIN_ERR_IP_OR_DEVICE_FORBIDDEN 10008 IP或设备被禁止接入。 HWM_LOGIN_ERR_ACCOUNT_OR_ENTERPRISE_NOT_ACTIVE 10009 账号或企业未激活。 HWM_LOGIN_ERR_AUTH_INFO_TIMEOUT 10011 鉴权信息过期(是否使用UTC时间,是否经过校准)。 HWM_LOGIN_ERR_ACCOUNT_STOPED 10013 账号被停用 HWM_CONF_ERR_CONF_ID_OR_PASSWORD_ERROR 20001 会议id或密码错误。 HWM_CONF_ERR_CONF_LOCKED 20002 会议被锁定。 HWM_CONF_ERR_NOT_IN_CONF 20003 不在会议中,接口调用非法。 HWM_CONF_ERR_VMR_NOT_BEEN_HOLD 20004 VMR会议,来宾不允许激活会议 HWM_CONF_ERR_SHARE_LOCKED 20005 共享被锁定 HWM_CONF_ERR_NOT_IN_DATA_CONF 20006 不在数据会议中 HWM_CONF_ERR_CONF_ONLY_SAME_ENTERPRISE 20007 只允许企业内用户加入会议 HWM_CONF_ERR_CONF_ONLY_INVITED 20008 只允许被邀请者加入会议 HWM_CALL_ERR_THIRD_USER_ID_NO_EXIST 20009 发起呼叫的第三方账号不存在 HWM_ERR_NOT_IN_CONF_OR_CALL 20010 不在会议或呼叫中 HWM_ERR_ALREADY_EXIST_CONF_OR_CALL 20011 已存在一路会议或呼叫 HWM_CONF_ERR_PASSWORD_ERROR_LOCKED 20012 多次输入密码错误导致会议暂时被锁定 HWM_CONF_ERR_CONF_ENDED 20013 会议已结束 HWM_CONF_ERR_SAME_PWD_WITH_CHAIR 20014 来宾密码与主持人密码相同 HWM_CONF_ERR_NUM_OF_PAR_EXCEEDS_UPPER_LIMIT 20015 与会方超出专用VMR套餐的最大与会人数 HWM_CONF_ERR_CONF_NOT_ON_LOCAL_STATION 20016 会议不在本站点 HWM_CONF_ERR_ENTERPRISE_CONCURRENCY_RESOURCE_NOT_ENOUGH 115022001 企业并发资源不足 HWM_CONF_ERR_CONF_DATA_NOT_FOUND 111070005 会议不存在 HWM_CONF_ERR_VMR_DATA_NOT_FOUND 111070006 个人云会议室不存在 HWM_CONF_ERR_CONF_ROLE_AUTHENTICATION_FAILED 111070010 权限不足,无法查看会议 HWM_CONF_ERR_VMR_CONF_CONFLICT 111071106 VMR会议冲突 HWM_CONF_ERR_MODIFY_FAIL_AS_CONF_ALREADY_STARTED 111071065 正在召开会议,无法编辑会议详情 HWM_ORG_CONCURRENT_PARTICIPANTS_NUMBER_IS_ZERO 111071060 企业未配置并发会议资源,无法使用个人会议ID和随机会议ID发起会议 HWM_CONF_USER_NOT_VMR_OWNER 111071063 非云会议室拥有者 HWM_CONF_ERR_CANCEL_FAIL_AS_CONF_STARTED 111071067 会议正在召开中,不允许取消会议 HWM_CONF_ERR_START_TIME_LESS_THAN_CURRENT_TIME 111071013 开始时间早于当前时间 HWM_CONF_ERR_START_TIME_OVER_MAX_SCHEDULE_TIME 111071014 会议开始时间超出最大预订时间范围 HWM_CONF_ERR_VMR_PWM_SAME_AS_MEETING_ID 201080017 来宾密码不能和会议ID相同 HWM_CONF_ERR_PARTICIPANT_CONF_NOT_SUPPORT 111084013 不支持该会议 HWM_CONF_ERR_ATTENDEES_NUMBER_EXCEED_LIMIT 111071066 与会方数量超出上限 HWM_CONF_ERR_VMR_DATA_STATUS_ILLEGAL 111073007 VMR套餐状态非法 HWM_CONF_ERR_WAIT_APPLY_RESOURCE 115029006 等待申请资源中 HWM_CONF_ERR_SDK_SVN_DETECT_FAILE 411000017 svn端口探测不通 HWM_CONF_ERR_RTC_NOT_SUPPORT_STG 411000019 RTC不支持STG模式 HWM_CONF_ERR_OVER_MAX_PARTICIPANT_NUMBER 111072101 超过设置的会议方数 HWM_CONF_ERR_AUDIENCE_VMR_LOGIC_RESOURCE_NOT_ENOUGH 111072202 观众数超过VMR套餐中的观众最大并发资源数 HWM_CONF_ERR_PARTICIPANT_VMR_LOGIC_RESOURCE_NOT_ENOUGH 111072203 主持人与嘉宾超过VMR套餐中的最大并发资源数 HWM_CONF_ERR_PARTICIPANT_CONF_NOT_EXIST 111081002 会场所在会议不存在或已结束 HWM_VMR_RESOURCE_UNAVAILABLE 201080000 云会议资源不可用 HWM_LOGIN_ERR_ACCOUNT_IS_UNBOUND 206010075 账号已经解绑 HWM_CONF_ERR_SERVER_ERROR 990000018 连接不上服务器 HWM_CONF_ERR_JOIN_ROOM_FAIL 990000019 无法加入会议 HWM_CONF_ERR_SERVER_BUSY 990000020 服务器繁忙 HWM_CONF_ERR_RTC_JOIN_ROOM_AUTH_FAIL 990000022 会议鉴权信息校验失败 HWM_CONF_ERR_SERVER_CONNECTION_ERROR 990000025 服务器连接异常 HWM_LOGIN_ERR_CA_VERIFY_FAILED 412100012 服务器CA证书校验失败 HWM_LOGIN_ERR_CURLE_EXTERN_CONNECT_TIMEOUT 412100017 代理通信超时,tcp建链失败,大概率是代理配置错误 HWM_LOGIN_ERR_CURLE_EXTERN_CLOSED_BY_PROXY 412100018 链接被代理断开,大概率是服务器地址配置错误 HWM_LOGIN_ERR_CURLE_COULDNT_RESOLVE_PROXY 412100024 proxy域名解析失败 HWM_LOGIN_ERR_CURLE_COULDNT_RESOLVE_HOST 412100025 服务器域名解析失败 HWM_LOGIN_E_ERR_MNG_FAILED 412100044 管理面故障 HWM_AGENT_ERR_CALLBACK_TIMEOUT 90001 等待回调超时 HWM_AGENT_ERR_IN_PROCESS 90002 接口正在处理中 HWM_AGENT_ERR_NOT_LOGIN 90003 未登录,接口调用非法。 HWM_AGENT_ERR_NOT_INITED_END 90004 未初始化或初始化尚未完成 HWM_AGENT_ERR_NOT_SUPPORT_END 90005 此版本不支持 HWM_AGENT_ERR_OPERATION_INTERRUPT 90012 操作中断 父主题: 错误码参考
  • SetConfIncomingAnswerResult 接口描述 该接口用于收到会议来电时设置应答。一般用于设置会议来电的自动拒绝或者自动接听。 注意事项 只有在收到会议来电后才能调用该接口(在通知接口OnConfIncoming中调用),其他情况不应调用该接口。 调用该接口设置应答类型:弹窗选择、拒绝、接听。 该接口为异步接口,返回值只代表接口是否调用成功,实际业务处理结果在对应的回调函数中返回。 如果是自动拒接来电,需要在Init初始化成功后,需要调用Config接口将isHideConfIncomingWindow设置成TRUE。 需要拒接时SetCallIncomingAnswerResult的参数传HWM_INCOMING_ANSWER_DECLINE,需要正常弹窗接听时传HWM_INCOMING_ANSWER_NORMAL。 方法定义 1 HWM_SDK_AGENT_API hwmsdk::HwmErrCode type(HWMInComingAnswerType type); 回调函数 1 virtual void OnSetConfIncomingAnswerResult(hwmsdk::HwmErrCode ret, const char* reason) {}; 参数描述 表1 枚举HWMInComingAnswerType说明 枚举值 描述 HWM_INCOMING_ANSWER_NORMAL 来电时应答采用原始体验弹窗选择。 HWM_INCOMING_ANSWER_DECLINE 来电时拒接 HWM_INCOMING_ANSWER_ANSWER 来电时接听 返回值 表2 返回值 类型 描述 HwmErrCode 成功返回0,其他值表示失败。失败返回值见错误码参考。 示例代码 1 2 3 4 5 6 7 8 9101112 /*** 收到会议来电后拒接来电*/void demoConfCtrlDlg::OnBnClickedSetConfIncomingAnswerResult(){ hwmsdkagent::HWMInComingAnswerType type = HWM_INCOMING_ANSWER_DECLINE; int ret = hwmsdkagent::SetConfIncomingAnswerResult(type); if (hwmsdk::HWM_COMMON_SUCCESS != ret) { AfxMessageBox(_T("SetConfIncomingAnswerResult error")); }}
  • 70.4.5更新内容 1.预约会议接口添加返回值参数说明,具体请见表3 2.sdk初始化约束,限制初始化必须在Application的OnCreate主线程中执行 3.新增获取用户当前状态接口,具体请见获取用户状态 4.会中新增主持人邀请他人共享,主持人也可快速取消共享 5.移动端的前后摄像头切换按钮放到主界面上 6.会议日志大小优化 7.libs文件夹中aar文件整合,使用时需先清空之前历史版本文件,重新导入 父主题: 版本更新内容
  • producer使用建议 同步复制客户端需要配合使用:acks=all 配置发送失败重试:retries=3 发送优化:对于时延敏感的信息,设置linger.ms=0。对于时延不敏感的信息,设置linger.ms在100~1000之间。 生产端的JVM内存要足够,避免内存不足导致发送阻塞。 时间戳设置为与当地时间一致,避免时间戳为未来时间导致消息无法老化。 尽量复用producer,不要频繁创建producer。当producer开启幂等时(生产者客户端3.0及之后的版本默认开启幂等),生产消息会在服务端创建生产者状态对象,若频繁创建producer,会导致服务端创建大量生产者状态对象后无法及时回收,服务端内存占用飙升,进而导致服务端性能急剧下降。如果不需要使用幂等功能,请将“enable.idempotence”设置为“false”。
  • consumer使用建议 consumer的owner线程需确保不会异常退出,避免客户端无法发起消费请求,阻塞消费。 确保处理完消息后再做消息commit,避免业务消息处理失败,无法重新拉取处理失败的消息。 通常不建议对每条消息都进行commit,如果对每条消息都进行了commit,会导致OFFSET_COMMIT请求过多,进而导致CPU使用率过高。例如:如果一个消费请求拉取1000条消息,每条都commit,则commit请求TPS是消费的1000倍,消息体越小,这个比例越大。建议隔一定条数或时间,批量commit,或打开enable.auto.commit,这样设置会存在一个缺点,即在客户端故障时,可能丢失一部分缓存的消费进度,导致重复消费。请根据业务实际情况,设置批量commit。 consumer不能频繁加入和退出group,频繁加入和退出,会导致consumer频繁做rebalance,阻塞消费。 同一消费组内consumer数量不能超过该消费组订阅的分区总数,否则会有consumer拉取不到消息。 consumer需周期poll,维持和server的心跳,避免心跳超时,导致consumer频繁加入和退出,阻塞消费。 consumer拉取的消息本地缓存应有大小限制,避免OOM(Out of Memory)。 consumer session设置为30秒,session.timeout.ms=30000。 Kafka不能保证消费重复的消息,业务侧需保证消息处理的幂等性。 消费线程退出要调用consumer的close方法,避免同一个组的其他消费者阻塞session.timeout.ms的时间。 消费组名称开头不使用特殊字符(如#),使用特殊字符可能会导致 云监控 无法展示此消费组的监控数据。
  • 迁移准备 配置网络环境。 Kafka实例分内网地址以及公网地址两种网络连接方式。如果使用公网地址,则消息生成与消费客户端需要有公网访问权限,并配置如下安全组。 表1 安全组规则 方向 协议 端口 源地址 说明 入方向 TCP 9094 Kafka客户端所在的IP地址或地址组 通过公网访问Kafka(明文接入)。 入方向 TCP 9095 Kafka客户端所在的IP地址或地址组 通过公网访问Kafka(密文接入)。 创建目标Kafka实例。 目标Kafka的规格不能低于原业务使用的Kafka规格。具体请参考购买Kafka实例。 在目标Kafka实例中创建Topic。 在目标Kafka实例上创建与原Kafka实例相同配置的Topic,包括Topic名称、副本数、分区数、消息老化时间,以及是否同步复制和落盘等。具体请参考创建Kafka Topic。
  • 迁移方案三:先迁消费,再迁生产 指首先通过Smart Connect同步两个Kafka的消息,其次将消费端迁移到新Kafka,最后将生产端迁移到新Kafka。 本方案依赖于Smart Connect,Smart Connect实时同步源端和目标端的数据,但是消费进度是通过批处理同步的,可能会导致源端和目标端每个分区的消费进度存在0-100之间的差异,存在少量重复消费问题。此场景适用于生产端不可停止,端到端有时延要求,但是可以兼容少量重复消费的业务。 创建Kafka数据复制的Smart Connect任务,用于同步两个Kafka的消息。具体步骤请参见配置Kafka间的数据复制。 在Kafka控制台的“消息查询”页面,查看两个Kafka的最新消息是否一致,确认两个Kafka的同步进度是否一致。具体步骤请参见查看Kafka消息。 是,执行3。 否,在监控页面查看两个Kafka的“Kafka每分钟同步数据量”是否正常,如果正常,先等待两个Kafka的同步进度一致,然后执行3。 将消费客户端的Kafka连接地址修改为新Kafka实例的连接地址。 重启消费业务,使得消费者从新Kafka实例中消费消息。 观察消费者是否能正常从新Kafka实例中获取数据。 修改生产客户端,Kafka连接地址改为新Kafka实例的连接地址。 重启生产客户端,将生产业务迁移到新Kafka实例中。 生产业务迁移后,观察连接新Kafka实例的消费业务是否正常。 迁移结束。
  • 迁移方案二:同时消费,后迁生产 指消费者业务启用多个消费客户端,分别向原Kafka和新Kafka实例消费消息,然后将生产业务切到新Kafka实例,这样能确保所有消息都被及时消费。 本方案中消费业务会在一段时间内同时消费原Kafka和新Kafka实例。由于在迁移生产业务之前,已经有消费业务运行在新Kafka实例上,因此不会存在端到端时延的问题。但在迁移生产的开始阶段,同时消费原Kafka与新Kafka实例,会导致部分消息之间的生产顺序无法保证,存在消息乱序的问题。此场景适用于对端到端时延有要求,却对消息顺序不敏感的业务。 启动新的消费客户端,配置Kafka连接地址为新Kafka实例的连接地址,消费新Kafka实例中的数据。 原有消费客户端需继续运行,消费业务同时消费原Kafka与新Kafka实例的消息。 修改生产客户端,Kafka连接地址改为新Kafka实例的连接地址。 重启生产客户端,将生产业务迁移到新Kafka实例中。 生产业务迁移后,观察连接新Kafka实例的消费业务是否正常。 等待原Kafka中数据消费完毕,关闭原有消费业务客户端。 迁移结束。
  • 迁移方案一:先迁生产,再迁消费 指先将生产消息的业务迁移到新的Kafka,原Kafka不会有新的消息生产。待原有Kafka实例的消息全部消费完成后,再将消费消息业务迁移到新的Kafka,开始消费新Kafka实例的消息。 本方案为业界通用的迁移方案,操作步骤简单,迁移过程由业务侧自主控制,整个过程中消息不会存在乱序问题,适用于对消息顺序有要求的场景。但是该方案中需要等待消费者业务直至消费完毕,存在一个时间差的问题,部分数据可能存在较大的端到端时延。 将生产客户端的Kafka连接地址修改为新Kafka实例的连接地址。 重启生产业务,使得生产者将新的消息发送到新Kafka实例中。 观察各消费组在原Kafka的消费进度,直到原Kafka中数据都已经被消费完毕。 将消费客户端的Kafka连接地址修改为新Kafka实例的连接地址。 重启消费业务,使得消费者从新Kafka实例中消费消息。 观察消费者是否能正常从新Kafka实例中获取数据。 迁移结束。
  • 测试结果 表2 测试结果 分区数 副本数 是否同步复制 batch.size 是否跨AZ生产 客户端消息生产速率 服务端CPU消耗(broker-0) 服务端CPU消耗(broker-1) 服务端CPU消耗(broker-2) 3 1 否 1KB 否 34128 58.10% 56.70% 53.30% 3 1 否 16KB 否 102399 24.10% 25.00% 23.30% 3 1 否 1KB 是 8523 17.20% 16.70% 18.80% 3 3 是 1KB 否 3981 60.00% 55.20% 50.00% 3 3 否 1KB 否 14468 86.70% 80.60% 86.20% 通过上表的测试结果,得出以下结论,仅供参考: 生产请求的batch.size变大16倍时,客户端消息生产速率增加,服务端CPU消耗减少。 同AZ生产和跨AZ生产相比,客户端消息生产速率增加,服务端CPU消耗也随之增加。 副本从1变成3时,客户端消息生产速率下降较多,服务端CPU消耗增加。 异步复制的Topic和同步复制的Topic相比,客户端消息生产速率增加,服务端CPU消耗也随之增加。
  • 测试步骤 测试场景一:批处理大小 登录客户端服务器,进入“kafka_2.12-2.7.2/bin”目录下,执行以下脚本。 batch.size=1KB,执行脚本如下: ./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=1024 linger.ms=0 --topic Topic-01 --num-records 8000000 --record-size 1024 --throughput 102400 执行结果如下: 8000000 records sent, 34128.673632 records/sec (33.33 MB/sec), 879.91 ms avg latency, 4102.00 ms max latency, 697 ms 50th, 2524 ms 95th, 2888 ms 99th, 4012 ms 99.9th. 客户端消息生产速率=34128 batch.size=16KB,执行脚本如下: ./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=16384 linger.ms=0 --topic Topic-01 --num-records 100000000 --record-size 1024 --throughput 102400 执行结果如下: 100000000 records sent, 102399.318430 records/sec (100.00 MB/sec), 4.72 ms avg latency, 914.00 ms max latency, 1 ms 50th, 5 ms 95th, 162 ms 99th, 398 ms 99.9th. 客户端消息生产速率=102399 登录Kafka实例控制台,单击测试实例名称,进入实例详情页。 在左侧导航栏单击“监控”,进入监控页面。 在“节点”页签,查看服务端节点的CPU使用率。 图1 broker-0的CPU使用率(batch.size=1KB) CPU消耗=58.10% 图2 broker-0的CPU使用率(batch.size=16KB) CPU消耗=24.10% 图3 broker-1的CPU使用率(batch.size=1KB) CPU消耗=56.70% 图4 broker-1的CPU使用率(batch.size=16KB) CPU消耗=25% 图5 broker-2的CPU使用率(batch.size=1KB) CPU消耗=53.30% 图6 broker-2的CPU使用率(batch.size=16KB) CPU消耗=23.30% 测试场景二:是否跨AZ生产 登录客户端服务器,进入“kafka_2.12-2.7.2/bin”目录下,执行以下脚本。 客户端服务器和实例在相同的AZ中,执行脚本如下: ./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=1024 linger.ms=0 --topic Topic-01 --num-records 8000000 --record-size 1024 --throughput 102400 执行结果如下: 8000000 records sent, 34128.673632 records/sec (33.33 MB/sec), 879.91 ms avg latency, 4102.00 ms max latency, 697 ms 50th, 2524 ms 95th, 2888 ms 99th, 4012 ms 99.9th. 客户端消息生产速率=34128 客户端服务器和实例在不同的AZ中,执行脚本如下: ./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=1024 linger.ms=0 --topic Topic-01 --num-records 4000000 --record-size 1024 --throughput 102400 执行结果如下: 4000000 records sent, 8523.042044 records/sec (8.32 MB/sec), 3506.20 ms avg latency, 11883.00 ms max latency, 1817 ms 50th, 10621 ms 95th, 11177 ms 99th, 11860 ms 99.9th. 客户端消息生产速率=8523 登录Kafka实例控制台,单击测试实例名称,进入实例详情页。 在左侧导航栏单击“监控”,进入监控页面。 在“节点”页签,查看服务端节点的CPU使用率。 图7 broker-0的CPU使用率(客户端服务器和实例在相同的AZ中) CPU消耗=58.10% 图8 broker-0的CPU使用率(客户端服务器和实例在不同的AZ中) CPU消耗=17.20% 图9 broker-1的CPU使用率(客户端服务器和实例在相同的AZ中) CPU消耗=56.70% 图10 broker-1的CPU使用率(客户端服务器和实例在不同的AZ中) CPU消耗=16.70% 图11 broker-2的CPU使用率(客户端服务器和实例在相同的AZ中) CPU消耗=53.30% 图12 broker-2的CPU使用率(客户端服务器和实例在不同的AZ中) CPU消耗=18.80% 测试场景三:副本数 登录客户端服务器,进入“kafka_2.12-2.7.2/bin”目录下,执行以下脚本。 1副本,执行脚本如下: ./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=1024 linger.ms=0 --topic Topic-01 --num-records 8000000 --record-size 1024 --throughput 102400 执行结果如下: 8000000 records sent, 34128.673632 records/sec (33.33 MB/sec), 879.91 ms avg latency, 4102.00 ms max latency, 697 ms 50th, 2524 ms 95th, 2888 ms 99th, 4012 ms 99.9th. 客户端消息生产速率=34128 3副本,执行脚本如下: ./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=1024 linger.ms=0 --topic Topic-02 --num-records 4000000 --record-size 1024 --throughput 102400 执行结果如下: 4000000 records sent, 14468.325219 records/sec (14.13 MB/sec), 2069.99 ms avg latency, 7911.00 ms max latency, 846 ms 50th, 6190 ms 95th, 6935 ms 99th, 7879 ms 99.9th. 客户端消息生产速率=14468 登录Kafka实例控制台,单击测试实例名称,进入实例详情页。 在左侧导航栏单击“监控”,进入监控页面。 在“节点”页签,查看服务端节点的CPU使用率。 图13 broker-0的CPU使用率(1副本) CPU消耗=58.10% 图14 broker-0的CPU使用率(3副本) CPU消耗=86.70% 图15 broker-1的CPU使用率(1副本) CPU消耗=56.70% 图16 broker-1的CPU使用率(3副本) CPU消耗=80.60% 图17 broker-2的CPU使用率(1副本) CPU消耗=53.30% 图18 broker-2的CPU使用率(3副本) CPU消耗=86.20% 测试场景四:同步/异步复制 登录客户端服务器,进入“kafka_2.12-2.7.2/bin”目录下,执行以下脚本。 异步复制,执行脚本如下: ./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=1 batch.size=1024 linger.ms=0 --topic Topic-02 --num-records 4000000 --record-size 1024 --throughput 102400 执行结果如下: 4000000 records sent, 14468.325219 records/sec (14.13 MB/sec), 2069.99 ms avg latency, 7911.00 ms max latency, 846 ms 50th, 6190 ms 95th, 6935 ms 99th, 7879 ms 99.9th. 客户端消息生产速率=14468 同步复制,执行脚本如下: ./kafka-producer-perf-test.sh --producer-props bootstrap.servers=192.168.0.69:9092,192.168.0.42:9092,192.168.0.66:9092 acks=-1 batch.size=1024 linger.ms=0 --topic Topic-03 --num-records 1000000 --record-size 1024 --throughput 102400 执行结果如下: 1000000 records sent, 3981.937930 records/sec (3.89 MB/sec), 7356.98 ms avg latency, 19013.00 ms max latency, 6423 ms 50th, 14381 ms 95th, 18460 ms 99th, 18975 ms 99.9th. 客户端消息生产速率=3981 登录Kafka实例控制台,单击测试实例名称,进入实例详情页。 在左侧导航栏单击“监控”,进入监控页面。 在“节点”页面,查看服务端节点的CPU使用率。 图19 broker-0的CPU使用率(异步复制) CPU消耗=86.70% 图20 broker-0的CPU使用率(同步复制) CPU消耗=60% 图21 broker-1的CPU使用率(异步复制) CPU消耗=80.60% 图22 broker-1的CPU使用率(同步复制) CPU消耗=55.20% 图23 broker-2的CPU使用率(异步复制) CPU消耗=86.20% 图24 broker-2的CPU使用率(同步复制) CPU消耗=50%
  • 测试环境 进行性能测试前,您需要先构建如下的测试环境: 购买一个Kafka实例,参数信息如下,其他参数保持默认,购买方法请参考购买Kafka实例。 区域:华北-北京四 可用区:可用区1 版本:2.7 部署架构:集群 代理规格:kafka.2u4g.cluster 代理数量:3 单代理存储空间:超高I/O,200GB 虚拟私有云:选择虚拟私有云 子网:选择子网 安全组:选择安全组 访问方式:保持默认 实例名称:kafka-test 企业项目:default 购买完成后,在实例详情页获取Kafka实例的内网明文连接地址。 在购买的Kafka实例中,创建如下参数的3个Topic,具体步骤请参考创建Kafka Topic。 Topic-01:3分区1副本,异步复制 Topic-02:3分区3副本,异步复制 Topic-03:3分区3副本,同步复制 获取测试工具。 获取Kafka命令行工具2.7.2版本。 购买客户端服务器。 购买如下参数的2台E CS 服务器,具体步骤请参考购买弹性云服务器。 区域、可用区、虚拟私有云、子网、安全组与Kafka实例保持一致,规格为4U8G,Linux系统的ECS。 区域、虚拟私有云、子网、安全组与Kafka实例保持一致,“可用区”为“可用区2”,规格为4U8G,Linux系统的ECS。 购买完成ECS后,需要在ECS中完成以下配置: 安装Java JDK,并配置JAVA_HOME与PATH环境变量。 export JAVA_HOME=/root/jdk1.8.0_231 export PATH=$JAVA_HOME/bin:$PATH 下载Kafka命令行工具2.7.2版本,并解压。 tar -zxf kafka_2.12-2.7.2.tgz
  • 测试脚本 ./kafka-producer-perf-test.sh --producer-props bootstrap.servers=${连接地址} acks=1 batch.size=${batch.size} linger.ms=0 --topic ${Topic名称} --num-records ${num-records} --record-size 1024 --throughput 102400 bootstrap.servers:购买Kafka实例中获取的Kafka实例的地址。 acks:消息主从同步策略,acks=1表示异步复制消息,acks=-1表示同步复制消息。 batch.size:每次批量发送消息的大小(单位为字节)。 linger.ms:两次发送时间间隔。 topic:创建Topic中设置的Topic名称。 num-records:总共需要发送的消息数。 record-size:每条消息的大小。 throughput:每秒发送的消息数。
  • CTS 支持的DMS for Kafka操作 表1 云审计 服务支持的DMS for Kafka操作列表 操作名称 资源类型 事件名称 创建DMS实例订单成功 kafka createDMSInstanceOrderSuccess 创建DMS实例任务执行成功 kafka createDMSInstanceTaskSuccess 创建DMS实例订单失败 kafka createDMSInstanceOrderFailure 创建DMS实例任务执行失败 kafka createDMSInstanceTaskFailure 删除创建失败的DMS实例成功 kafka deleteDMSCreateFailureInstancesSuccess 删除创建失败的DMS实例失败 kafka deleteDMSCreateFailureInstancesFailure 删除DMS实例任务执行成功 kafka deleteDMSInstanceTaskSuccess 删除DMS实例任务执行失败 kafka deleteDMSInstanceTaskFailure 批量删除DMS实例任务 kafka batchDeleteDMSInstanceTask 提交批量删除DMS实例请求成功 kafka batchDeleteDMSInstanceSuccess 批量删除DMS实例任务执行成功 kafka batchDeleteDMSInstanceTaskSuccess 提交批量删除DMS实例请求失败 kafka batchDeleteDMSInstanceFailure 批量删除DMS实例任务执行失败 kafka batchDeleteDMSInstanceTaskFailure 提交修改DMS实例订单请求成功 kafka modifyDMSInstanceOrderSuccess 提交修改DMS实例订单请求失败 kafka modifyDMSInstanceOrderFailure 提交扩容实例请求成功 kafka extendDMSInstanceSuccess 扩容DMS实例任务执行成功 kafka extendDMSInstanceTaskSuccess 提交扩容实例请求失败 kafka extendDMSInstanceFailure 扩容DMS实例任务执行失败 kafka extendDMSInstanceTaskFailure 提交重置DMS实例密码请求成功 kafka resetDMSInstancePasswordSuccess 提交重置DMS实例密码请求失败 kafka resetDMSInstancePasswordFailure 提交重启DMS实例请求成功 kafka restartDMSInstanceSuccess 重启DMS实例任务执行成功 kafka restartDMSInstanceTaskSuccess 提交重启DMS实例请求失败 kafka restartDMSInstanceFailure 重启DMS实例任务执行失败 kafka restartDMSInstanceTaskFailure 提交批量重启DMS实例请求成功 instance batchRestartDMSInstanceSuccess 批量重启DMS实例任务执行成功 kafka batchRestartDMSInstanceTaskSuccess 提交批量重启DMS实例请求失败 instance batchRestartDMSInstanceFailure 批量重启DMS实例任务执行失败 kafka batchRestartDMSInstanceTaskFailure 提交修改DMS实例信息请求成功 kafka modifyDMSInstanceInfoSuccess 修改DMS实例信息任务执行成功 kafka modifyDMSInstanceInfoTaskSuccess 提交修改DMS实例信息请求失败 kafka modifyDMSInstanceInfoFailure 修改DMS实例信息任务执行失败 kafka modifyDMSInstanceInfoTaskFailure 删除后台任务成功 kafka deleteDMSBackendJobSuccess 删除后台任务失败 kafka deleteDMSBackendJobFailure 开启Smart Connect任务执行成功 kafka createConnectorTaskSuccess 创建Smart Connect任务执行成功 kafka createConnectorSinkTaskSuccess 开启Smart Connect任务执行失败 kafka createConnectorTaskFailure 创建Smart Connect任务执行失败 kafka createConnectorSinkTaskFailure 冻结DMS实例任务执行成功 kafka freezeDMSInstanceTaskSuccess 冻结DMS实例任务执行失败 kafka freezeDMSInstanceTaskFailure 解冻DMS实例任务执行成功 kafka unfreezeDMSInstanceTaskSuccess 解冻DMS实例任务执行失败 kafka unfreezeDMSInstanceTaskFailure Kafka实例创建Topic成功 kafka Kafka_create_topicSuccess Kafka实例创建Topic失败 kafka Kafka_create_topicFailure Kafka实例删除Topic成功 kafka Kafka_delete_topicsSuccess Kafka实例删除Topic失败 kafka Kafka_delete_topicsFailure 开启自动创建Topic成功 kafka enable_auto_topicSuccess 开启自动创建Topic失败 kafka enable_auto_topicFailure 修改Topic成功 kafka Kafka_alter_topicsSuccess 修改Topic失败 kafka Kafka_alter_topicsFailure 执行Topic分区平衡任务成功 kafka kafka_reassignmentTaskSuccess 执行Topic分区平衡任务失败 kafka kafka_reassignmentTaskFailure 提交执行Topic分区平衡请求成功 kafka kafka_reassignmentSuccess 提交执行Topic分区平衡请求失败 kafka kafka_reassignmentFailure 重置消费组偏移量成功 kafka Kafka_reset_consumer_offsetSuccess 重置消费组偏移量失败 kafka Kafka_reset_consumer_offsetFailure 批量删除消费组成功 kafka Kafka_batch_delete_groupSuccess 批量删除消费组失败 kafka Kafka_batch_delete_groupFailure 创建用户成功 kafka createUserSuccess 创建用户失败 kafka createUserFailure 删除用户成功 kafka deleteUserSuccess 删除用户失败 kafka deleteUserFailure 更新用户策略成功 kafka updateUserPoliciesTaskSuccess 更新用户策略失败 kafka updateUserPoliciesTaskFailure 回收站恢复实例成功 kafka out_recycleTaskSuccess 回收站恢复实例失败 kafka out_recycleTaskFailure
  • 注意事项 表1 数据库代理注意事项 分类 注意事项 版本约束 TaurusDB实例内核版本如下时,不支持开通数据库代理。 大于等于2.0.26.2且小于等于2.0.28.3 等于2.0.29.1 TaurusDB实例的内核版本低于2.0.42.230601时,仅支持创建1个代理实例。 TaurusDB实例的内核版本高于或等于2.0.42.230601时,最多支持创建4个代理实例。 不支持的功能 数据库代理不支持压缩协议。 数据库代理不支持事务隔离级别READ-UNCOMMITTED。 数据库代理不支持读写表中单列超过16MB的数据。 数据库代理不支持SQL_MODE参数PAD_CHAR_TO_FULL_LENGTH。 使用约束 实例的CPU总核数(即所有节点的CPU核数的总和)低于8核时,不支持开通数据库代理。 至少创建1个只读节点才能开启读写分离功能。 开启读写分离功能后,不允许修改TaurusDB实例的端口和读写内网地址。 如果执行了Multi-Statements,当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。 使用代理地址时,事务请求都会路由到实例的主节点(可以使用事务拆分功能对事务中写之前的读请求进行拆分),不保证非事务读的一致性,业务上有读一致性需求可以封装到事务中。 使用代理地址时,show processlist和直连数据库有差异。因为数据库代理的show processlist是逻辑的,仅仅将通过数据库代理节点下发的业务展示出来,所以和直连数据库有差异。 当某一个代理节点处于异常状态时,通过代理执行show processlist或者Kill时,有可能会出现命令执行时间稍微变长的情况,此时无需关注,业务不会受到影响。 当数据库代理进行缩容后,通过代理执行show processlist命令时,可能会将被缩容的节点上的业务展示出来。 通过数据库代理进行Kill时,偶尔可能会出现超时等报错信息,此时可以通过二次show processlist查看业务是否真正被Kill成功。 当数据库代理的某个节点处于异常状态时,执行show processlist命令时,可能会出现2秒卡顿,此时无需关注,结果会正常返回。 当使用数据库代理时,多语句拼接的SQL大小不超过100MB,避免数据库代理解析SQL消耗过多的资源。 当使用数据库代理时,不能使用中文数据库和中文用户名。 HTAP实时分析 不支持一致性级别和连接池。 路由模式仅支持权重负载模式。 代理模式仅支持读写模式。
  • 修改内网域名 在“实例管理”页面,选择指定的实例,单击实例名称,进入实例概览页面。 在“网络信息”模块“内网域名”处,单击“修改”。 图1 修改内网域名 在“修改内网域名”弹出框中填写新域名,单击“确定”,保存修改内容。 内网域名只允许修改前缀部分。 内网域名前缀部分长度为8~63个字符,只能包含小写字母、数字。 新的内网域名不可与当前已存在的有效域名重复。 若您已开启高危操作保护,在“身份验证”弹出框中单击“获取验证码”,正确输入验证码并单击“确定”,页面自动关闭。 通过进行二次认证再次确认您的身份,进一步提高账号安全性,有效保护您安全使用云产品。关于如何开启操作保护,具体请参考《 统一身份认证 服务用户指南》的内容。
  • 基本概念 代理地址 购买数据库代理后,可以从数据库代理中查看代理地址,连接该地址可以执行读写操作,数据库代理会通过代理地址自动将写请求发送到主节点,将读请求发送到只读节点,降低主节点的压力。 代理模式 TaurusDB的代理模式支持读写模式和只读模式。 读写模式:所有写请求只发往主节点,所有读请求按照读权重配比或者是活跃连接数情况分发到已选节点。 只读模式:所有读请求按照读权重配比或者是活跃连接数情况分发到已选只读节点,不会分发到主节点。 事务拆分 数据库代理提供事务拆分的功能,能够将事务内写操作之前的读请求转发到只读节点,降低主节点负载。 更多关于事务拆分的内容请参见开启TaurusDB代理的事务拆分功能。 连接池 数据库代理提供了会话级连接池,可减少短连接业务频繁建立连接导致数据库负载高。 更多关于连接池的内容请参见开启TaurusDB代理的连接池功能。 路由模式 TaurusDB数据库代理支持权重负载、负载均衡的路由模式,可根据需要配置不同的路由模式。 权重负载:根据您设置的读权重比例分发读请求。 负载均衡:根据数据库节点的活跃连接数情况进行读请求分发,将读请求分发到活跃连接数较少的节点上。负载均衡模式不需要修改权重。 更多关于路由模式的内容请参见路由模式。
  • 读写分离优势 相比在应用程序内手动做读写分离,扩容灵活,维护成本低。 客户端读请求按权重分发至后端只读节点,数据库实例整体负载更加均衡,提升资源利用率。 通过代理将指定业务的读请求路由到选定的只读实例上,实现业务隔离,避免多个业务之间相互影响。 数据库代理默认提供过载保护功能:避免用户执行大结果集操作时,因压力过大引起服务端OOM。该功能默认打开,不需要用户单独设置。针对数据库内核过慢引起的压力,依赖数据库限流机制。
  • 请求路由规则 只发往主节点的写请求 INSERT、UPDATE、DELETE。 所有DDL操作(建表/库、删表/库、变更表结构、权限等)。 所有事务中的请求(事务拆分开启时部分读请求可能发送至只读节点,详见事务拆分)。 用户自定义函数。 存储过程。 EXECUTE语句。 Multi Statements。 使用到临时表的请求。 所有对用户变量的更改。 KILL(SQL语句中的KILL,非命令KILL)。 发往主节点的读请求 如果查询语句被放在事务中,事务请求都会路由到主实例。如果在查询语句前设置set autocommit=0时也当做事务处理路由到主实例。 如果所有只读节点都均异常或只读节点权重为0时,则查询会路由到主实例。对于成功开启读写分离功能的实例,您可以设置其主实例和只读实例的权重。 在执行SQL语句时: 如果执行了Multi-Statements(如“insert xxx;select xxx”),当前连接的后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。 带锁的读操作(如SELECT for UPDATE)会被路由到主节点。 当使用/*FORCE_MASTER*/这个Hint语句时,会被路由到主实例。 如果执行了Handler语句,默认后续请求会全部路由到主节点,需断开当前连接并重新连接才能恢复读写分离。 SELECT last_insert_id()。 所有对用户变量的查询。 发往只读节点或主节点 非事务中的SELECT。 COM_STMT_EXECUTE命令。 总是发往所有节点 所有系统变量的更改。 USE命令。
共100000条
提示

您即将访问非华为云网站,请注意账号财产安全