【StoneDB】從庫如何規避不支持的DML和DDL

来源:https://www.cnblogs.com/yangwilly/archive/2022/08/16/16591674.html
-Advertisement-
Play Games

(以下情況僅針對StoneDB 1.0版本不支持的部分DML和DDL操作,StoneDB 2.0及以上版本將無需此類操作) 主從複製中,主庫的任何更新都會同步到從庫,如果從庫不想重做主庫的某個更新動作,可以使用以下兩種方法進行規避。當然,最終帶來的影響是主從環境數據不一致的問題。 以下的測試環境中, ...


(以下情況僅針對StoneDB 1.0版本不支持的部分DML和DDL操作,StoneDB 2.0及以上版本將無需此類操作)
主從複製中,主庫的任何更新都會同步到從庫,如果從庫不想重做主庫的某個更新動作,可以使用以下兩種方法進行規避。當然,最終帶來的影響是主從環境數據不一致的問題。
以下的測試環境中,主庫是 InnoDB,從庫是 StoneDB,在主庫做從庫不支持的 DML 或者 DDL。

從庫執行 GTID 的空事務

###主庫
mysql> show create table ttt\G                             
*************************** 1. row ***************************
       Table: ttt
Create Table: CREATE TABLE `ttt` (
  `id` int(11) NOT NULL,
  `name` varchar(5) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

mysql> select * from ttt;     
+----+------+
| id | name |
+----+------+
|  1 | AAA  |
|  2 | BBB  |
|  3 | CCC  |
+----+------+
3 rows in set (0.00 sec)

###從庫
mysql> show create table ttt\G
*************************** 1. row ***************************
       Table: ttt
Create Table: CREATE TABLE `ttt` (
  `id` int(11) NOT NULL,
  `name` varchar(5) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=STONEDB DEFAULT CHARSET=utf8mb4
1 row in set (0.02 sec)

mysql> select * from ttt;
+----+------+
| id | name |
+----+------+
|  1 | AAA  |
|  2 | BBB  |
|  3 | CCC  |
+----+------+
3 rows in set (0.00 sec)

###主庫
mysql> delete from ttt where id=3;
Query OK, 1 row affected (0.00 sec)

mysql> select * from ttt;                
+----+------+
| id | name |
+----+------+
|  1 | AAA  |
|  2 | BBB  |
+----+------+
2 rows in set (0.00 sec)

###從庫
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.30.101
                  Master_User: u_repl
                  Master_Port: 33306
                Connect_Retry: 60
              Master_Log_File: binlog.000002
          Read_Master_Log_Pos: 1053
               Relay_Log_File: ub01-relay-bin.000002
                Relay_Log_Pos: 993
        Relay_Master_Log_File: binlog.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: No
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 1031
                   Last_Error: Error 'Table storage engine for 'ttt' doesn't have this option' on query. Default database: 'db'. Query: 'delete from ttt where id=3'
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 786
              Relay_Log_Space: 1466
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: NULL
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 1031
               Last_SQL_Error: Error 'Table storage engine for 'ttt' doesn't have this option' on query. Default database: 'db'. Query: 'delete from ttt where id=3'
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 101
                  Master_UUID: ae40cabd-efb2-11ec-ac20-44a84203989a
             Master_Info_File: /data/stonedb/install/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: 
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 220729 02:26:29
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: ae40cabd-efb2-11ec-ac20-44a84203989a:1-4
            Executed_Gtid_Set: 4ddecc1a-ee49-11ec-96fe-f219e7257407:1,
ae40cabd-efb2-11ec-ac20-44a84203989a:1-3
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

mysql> select * from ttt;
+----+------+
| id | name |
+----+------+
|  1 | AAA  |
|  2 | BBB  |
|  3 | CCC  |
+----+------+
3 rows in set (0.00 sec)

主庫執行 delete後,由於 StoneDB 不支持 delete,從庫會有報錯,並且主從複製中斷。
下一步需要在主庫找到執行 delete操作的gtid值。

###主庫
mysql> show binary logs;
+---------------+-----------+
| Log_name      | File_size |
+---------------+-----------+
| binlog.000001 |       177 |
| binlog.000002 |      1053 |
+---------------+-----------+
2 rows in set (0.00 sec)

mysql> show binlog events in '/data/stonedb/install/binlog/binlog.000002';
+---------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
| Log_name      | Pos  | Event_type     | Server_id | End_log_pos | Info                                                              |
+---------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
| binlog.000002 |    4 | Format_desc    |       101 |         123 | Server ver: 5.7.36-StoneDB-log, Binlog ver: 4                     |
| binlog.000002 |  123 | Previous_gtids |       101 |         154 |                                                                   |
| binlog.000002 |  154 | Gtid           |       101 |         219 | SET @@SESSION.GTID_NEXT= 'ae40cabd-efb2-11ec-ac20-44a84203989a:1' |
| binlog.000002 |  219 | Query          |       101 |         307 | create database db                                                |
| binlog.000002 |  307 | Gtid           |       101 |         372 | SET @@SESSION.GTID_NEXT= 'ae40cabd-efb2-11ec-ac20-44a84203989a:2' |
| binlog.000002 |  372 | Query          |       101 |         494 | use `db`; create table ttt(id int primary key,name varchar(5))    |
| binlog.000002 |  494 | Gtid           |       101 |         559 | SET @@SESSION.GTID_NEXT= 'ae40cabd-efb2-11ec-ac20-44a84203989a:3' |
| binlog.000002 |  559 | Query          |       101 |         634 | BEGIN                                                             |
| binlog.000002 |  634 | Query          |       101 |         755 | use `db`; insert into ttt values(1,'AAA'),(2,'BBB'),(3,'CCC')     |
| binlog.000002 |  755 | Xid            |       101 |         786 | COMMIT /* xid=20 */                                               |
| binlog.000002 |  786 | Gtid           |       101 |         851 | SET @@SESSION.GTID_NEXT= 'ae40cabd-efb2-11ec-ac20-44a84203989a:4' |
| binlog.000002 |  851 | Query          |       101 |         926 | BEGIN                                                             |
| binlog.000002 |  926 | Query          |       101 |        1022 | use `db`; delete from ttt where id=3                              |
| binlog.000002 | 1022 | Xid            |       101 |        1053 | COMMIT /* xid=28 */                                               |
+---------------+------+----------------+-----------+-------------+-------------------------------------------------------------------+
14 rows in set (0.00 sec)

如果是在生產環境找主庫 delete 操作的 gtid 值,需要知道哪個時間點,然後用 mysqlbinlog 解析binlog。
這裡由於是做測試,可以簡單快遞的找到 delete 操作的 gtid 值,ae40cabd-efb2-11ec-ac20-44a84203989a:4。
gtid 值由參數 server_uuid 和事務 id 組成,標識一個這個操作的唯一性。

###從庫
set gtid_next='ae40cabd-efb2-11ec-ac20-44a84203989a:4';
begin;
commit;
set gtid_next=automatic;
start slave;

mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.30.101
                  Master_User: u_repl
                  Master_Port: 33306
                Connect_Retry: 60
              Master_Log_File: binlog.000002
          Read_Master_Log_Pos: 1053
               Relay_Log_File: ub01-relay-bin.000002
                Relay_Log_Pos: 1260
        Relay_Master_Log_File: binlog.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 1053
              Relay_Log_Space: 1466
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 101
                  Master_UUID: ae40cabd-efb2-11ec-ac20-44a84203989a
             Master_Info_File: /data/stonedb/install/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: ae40cabd-efb2-11ec-ac20-44a84203989a:1-4
            Executed_Gtid_Set: 4ddecc1a-ee49-11ec-96fe-f219e7257407:1,
ae40cabd-efb2-11ec-ac20-44a84203989a:1-4
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

mysql> select * from ttt;
+----+------+
| id | name |
+----+------+
|  1 | AAA  |
|  2 | BBB  |
|  3 | CCC  |
+----+------+
3 rows in set (0.00 sec)

利用 gtid 跳過一個空事務後,主從複製的線程已經正常啟動,但由於 StoneDB 不支持 delete,現在主從環境數據是不一致的。

###主庫
mysql> insert into ttt values(4,'DDD');
Query OK, 1 row affected (0.00 sec)

mysql> select * from ttt;
+----+------+
| id | name |
+----+------+
|  1 | AAA  |
|  2 | BBB  |
|  4 | DDD  |
+----+------+
3 rows in set (0.00 sec)

###從庫
mysql> select * from ttt;
+----+------+
| id | name |
+----+------+
|  1 | AAA  |
|  2 | BBB  |
|  3 | CCC  |
|  4 | DDD  |
+----+------+
4 rows in set (0.00 sec)

主從複製的線程啟動後,主庫的更新,從庫同步正常。

如果覺得在主庫找 delete 的 gtid 值麻煩,在主庫執行 delete 前,可以指定 delete 的 gtid 值。在從庫還是根據這個 gtid 值執行空事務。

###
mysql> show variables like 'server_uuid';
+---------------+--------------------------------------+
| Variable_name | Value                                |
+---------------+--------------------------------------+
| server_uuid   | ae40cabd-efb2-11ec-ac20-44a84203989a |
+---------------+--------------------------------------+
1 row in set (0.01 sec)

mysql> set gtid_next='ae40cabd-efb2-11ec-ac20-44a84203989a:100';
Query OK, 0 rows affected (0.00 sec)

mysql> begin;
Query OK, 0 rows affected (0.00 sec)

mysql> delete from ttt where id=1;
Query OK, 1 row affected (0.00 sec)

mysql> commit;
Query OK, 0 rows affected (0.00 sec)

mysql> set gtid_next=automatic;
Query OK, 0 rows affected (0.00 sec)

###從庫
set gtid_next='ae40cabd-efb2-11ec-ac20-44a84203989a:100';
begin;
commit;
set gtid_next=automatic;
start slave;

關閉當前線程的binlog

###主庫
mysql> show create table ttt\G                                             
*************************** 1. row ***************************
       Table: ttt
Create Table: CREATE TABLE `ttt` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

mysql> select * from ttt;     
+----+------+
| id | name |
+----+------+
|  1 | AAA  |
|  2 | BBB  |
+----+------+
2 rows in set (0.00 sec)

###從庫
mysql> show create table ttt\G
*************************** 1. row ***************************
       Table: ttt
Create Table: CREATE TABLE `ttt` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=STONEDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

mysql> select * from ttt;
+----+------+
| id | name |
+----+------+
|  1 | AAA  |
|  2 | BBB  |
+----+------+
2 rows in set (0.00 sec)

###主庫
mysql> set sql_log_bin=off;
Query OK, 0 rows affected (0.00 sec)

mysql> alter table ttt modify name varchar(10);
Query OK, 0 rows affected (0.00 sec)
Records: 0  Duplicates: 0  Warnings: 0

mysql> show create table ttt\G                 
*************************** 1. row ***************************
       Table: ttt
Create Table: CREATE TABLE `ttt` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3 DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

###從庫
mysql> show slave status\G
*************************** 1. row ***************************
               Slave_IO_State: Waiting for master to send event
                  Master_Host: 192.168.30.101
                  Master_User: u_repl
                  Master_Port: 33306
                Connect_Retry: 60
              Master_Log_File: binlog.000002
          Read_Master_Log_Pos: 2288
               Relay_Log_File: ub01-relay-bin.000002
                Relay_Log_Pos: 2495
        Relay_Master_Log_File: binlog.000002
             Slave_IO_Running: Yes
            Slave_SQL_Running: Yes
              Replicate_Do_DB: 
          Replicate_Ignore_DB: 
           Replicate_Do_Table: 
       Replicate_Ignore_Table: 
      Replicate_Wild_Do_Table: 
  Replicate_Wild_Ignore_Table: 
                   Last_Errno: 0
                   Last_Error: 
                 Skip_Counter: 0
          Exec_Master_Log_Pos: 2288
              Relay_Log_Space: 2701
              Until_Condition: None
               Until_Log_File: 
                Until_Log_Pos: 0
           Master_SSL_Allowed: No
           Master_SSL_CA_File: 
           Master_SSL_CA_Path: 
              Master_SSL_Cert: 
            Master_SSL_Cipher: 
               Master_SSL_Key: 
        Seconds_Behind_Master: 0
Master_SSL_Verify_Server_Cert: No
                Last_IO_Errno: 0
                Last_IO_Error: 
               Last_SQL_Errno: 0
               Last_SQL_Error: 
  Replicate_Ignore_Server_Ids: 
             Master_Server_Id: 101
                  Master_UUID: ae40cabd-efb2-11ec-ac20-44a84203989a
             Master_Info_File: /data/stonedb/install/data/master.info
                    SQL_Delay: 0
          SQL_Remaining_Delay: NULL
      Slave_SQL_Running_State: Slave has read all relay log; waiting for more updates
           Master_Retry_Count: 86400
                  Master_Bind: 
      Last_IO_Error_Timestamp: 
     Last_SQL_Error_Timestamp: 
               Master_SSL_Crl: 
           Master_SSL_Crlpath: 
           Retrieved_Gtid_Set: ae40cabd-efb2-11ec-ac20-44a84203989a:1-8:100
            Executed_Gtid_Set: 4ddecc1a-ee49-11ec-96fe-f219e7257407:1-3,
ae40cabd-efb2-11ec-ac20-44a84203989a:1-8:100
                Auto_Position: 1
         Replicate_Rewrite_DB: 
                 Channel_Name: 
           Master_TLS_Version: 
1 row in set (0.00 sec)

mysql> show create table ttt\G
*************************** 1. row ***************************
       Table: ttt
Create Table: CREATE TABLE `ttt` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(5) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=STONEDB DEFAULT CHARSET=utf8mb4
1 row in set (0.00 sec)

主庫關閉當前線程的binlog,對錶做DDL,將欄位 name 的長度擴大。
主從複製正常,從庫表的欄位 name 的長度不變。

###主庫
開啟新的線程,註意一點是開啟新的線程!!!
mysql> insert into ttt(name) values('CCC');
Query OK, 1 row affected (0.00 sec)

mysql> select * from ttt;                  
+----+------+
| id | name |
+----+------+
|  1 | AAA  |
|  2 | BBB  |
|  3 | CCC  |
+----+------+
3 rows in set (0.00 sec)

###從庫
mysql> select * from ttt;
+----+------+
| id | name |
+----+------+
|  1 | AAA  |
|  2 | BBB  |
|  3 | CCC  |
+----+------+
3 rows in set (0.00 sec)

sql_log_bin=off,關閉的是當前線程的binlog,不影響其他線程的任何更新。

以上兩種方法都可以規避從庫不想重做主庫的某個更新動作,目的是讓從庫遇到不支持的操作時可以讓主從複製的線程正常工作,但帶來的問題是主從環境數據不一致。


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 無根用戶管理podman 在允許沒有root特權的用戶運行Podman之前,管理員必須安裝或構建Podman並完成以下配置 基礎設置 cgroup V2Linux內核功能允許用戶限制普通用戶容器可以使用的資源,如果使用cgroupV2啟用了運行Podman的Linux發行版,則可能需要更改預設的OC ...
  • MindNode 5 for Mac是一款應用於mac平臺的思維導圖軟體產品,為用戶在靈感啟發、思緒整理、記憶協助、項目規劃、授課講演等諸多場景下提升學習和工作效率。通過導圖社區和雲文件無縫鏈接用戶設備,方便用戶隨時隨地收集靈感和展示文檔。 詳情:MindNode 5 for Mac(思維導圖) m ...
  • podman的基本設置和使用 運行httpd示例容器 [root@localhost ~]# podman run -dt -p 8080:8080/tcp -e HTTPD_VAR_RUN=/run/httpd -e HTTPD_MAIN_CONF_D_PATH=/etc/httpd/conf.d ...
  • Amoeba+Mysql實現資料庫讀寫分離 一、Amoeba 是什麼 Amoeba(變形蟲)項目,專註 分散式資料庫 proxy 開發。座落與Client、DB Server(s)之間。對客戶端透明。具有負載均衡、高可用性、sql過濾、讀寫分離、可路由相關的query到目標資料庫、可併發請求多台數據 ...
  • 系統負載高 系統負載高導致了申請系統資源失敗,最後資料庫實例crash,常見原因及診斷方法詳見系統資源瓶頸診斷。 數據頁損壞 如果是硬體故障或者磁碟空間滿了,向數據文件寫入時,很容易導致數據文件的寫corrupt,為了保證數據的一致性,資料庫實例會crash。 Bug 資料庫實例發生crash的一個 ...
  • MySQL刪除數據的方式 以MySQL 5.7為例,資料庫刪除數據的方式一共有以下三種: delete truncate drop 以上三種方式都可以刪除數據,但是使用場景是不同的。 對於整個表進行刪除的執行速度來說: drop > truncate >> delete MySQL刪除數據的方式-d ...
  • FileMaker Pro19 Advanced 是一款功能強大、易於使用的資料庫軟體。它能幫助你和你的團隊更快地完成各種類型的工作。在商業、政府和教育領域,有數百萬的用戶使用 FileMaker Pro 輕鬆地管理 iPad、iPhone、Windows、Mac 和 Web 上的全部信息。 Mac ...
  • 數據可視化工具數不勝數,只看顏值的話,這4款才是我的心頭好: 1. 山海鯨可視化 官網:https://www.shanhaibi.com/ 山海鯨可視化是一款國產自研的數據可視化大屏編輯軟體,零基礎也能快速上手。幫助大家越過了數字孿生系統開發的高技術門檻,讓沒有技術基礎的用戶只需通過簡單的點擊拖拽 ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...