{"content":{"title":"Magician-Web3 1.0.5 发布啦，加入了负载均衡 和 重试策略","body":"Magician-Web3 是一个区块链开发工具包。它由两个功能组成。一个是扫描区块链，根据开发者的需要监控交易。另一个是对 web3j 的一些二次打包，可以减少开发者在一些常见场景下的工作量。它计划支持三种链，ETH（BSC、POLYGAN 等）、SOL 和 TRON\r\n\r\n## 本次更新的点\r\n\r\n1. 加入了负载均衡，只要配置多个 RPC URL 即可自动轮询，可以将流量分散给多个节点，不用一直盯着一个节点 “祸害了”\r\n\r\n2. 加入了重试策略，当出现了某些意外的原因 导致区块被跳过扫描，那么被跳过的区块高度将进入重试策略，你可以自己进行处理\r\n\r\n3. 修改了一点点细节\r\n\r\n## 负载均衡\r\n\r\n直接设置多个 rpc 地址即可\r\n\r\n```java\r\nMagicianBlockchainScan.create()\r\n                    .setRpcUrl(\r\n                            // 可以设置1到n个 rpc地址了，超过一个将自动轮询使用\r\n                            EthRpcInit.create()\r\n                                    .addRpcUrl(\"https://data-seed-prebsc-1-s1.binance.org:8545\")\r\n                                    .addRpcUrl(\"https://data-seed-prebsc-2-s1.binance.org:8545\")\r\n                                    .addRpcUrl(\"https://data-seed-prebsc-1-s2.binance.org:8545\")\r\n                    )\r\n                    .setScanPeriod(1000)\r\n                    .setBeginBlockNumber(BlockEnums.LAST_BLOCK_NUMBER.getValue())\r\n                    .addEthMonitorEvent(new EventOne())\r\n                    .addEthMonitorEvent(new EventThree())\r\n                    .setRetryStrategy(new EthRetry())\r\n                    .start();\r\n```\r\n\r\n## 重试策略\r\n\r\n在符合以下两个条件时，会触发重试策略，两个条件必须全都符合 才会触发重试\r\n\r\n1. 当前正在扫描的块高 是空的（块不存在 或者 块里面没交易）\r\n\r\n2. 当前正在扫描的块高 < 链上的最新块高\r\n\r\n当上面两个条件同时符合的时候，扫描任务会跳过这个块，然后继续扫描下一个块，同时 重试策略会收到被跳过的块高， 你可以在重试策略里 自己处理\r\n\r\n### 创建一个重试策略\r\n\r\n```java\r\npublic class EthRetry implements RetryStrategy {\r\n\r\n    @Override\r\n    public void retry(BigInteger blockNumber) {\r\n        \r\n    }\r\n}\r\n```\r\n\r\n### 将重试策略添加到扫描任务中\r\n\r\n```java\r\nMagicianBlockchainScan.create()\r\n        .setRetryStrategy(new EthRetry())// 调用这个方法添加\r\n        .start();\r\n```\r\n\r\n### 需要注意线程数量的配置\r\n\r\n如果你此时开了一个扫块任务 + 一个 重试策略，那么需要占用两个线程，所以参数必须传 2\r\n\r\n```java\r\n// 初始化线程池，核心线程数必须 >= 扫块的任务数量 + 重试策略的数量\r\nEventThreadPool.init(2);\r\n```\r\n\r\n## 细节调整\r\n\r\n1. 扫描频率最低可以设置 500 毫秒\r\n\r\n2. 设置 RPC 地址的 传参类型变了\r\n\r\n3. 由于第二点的优化，现在可以根据 RPC 地址的类型来判断你要扫描什么链了，所以去除了 ChainType 的设置\r\n\r\n```java\r\nMagicianBlockchainScan.create()\r\n                    .setRpcUrl(// 这里发生了改变\r\n                            EthRpcInit.create()\r\n                                    .addRpcUrl(\"https://data-seed-prebsc-1-s1.binance.org:8545\")\r\n                                    .addRpcUrl(\"https://data-seed-prebsc-2-s1.binance.org:8545\")\r\n                                    .addRpcUrl(\"https://data-seed-prebsc-1-s2.binance.org:8545\")\r\n                    )\r\n                    .setScanPeriod(1000)// 这个参数最低可以设置为500了\r\n                    .setBeginBlockNumber(BlockEnums.LAST_BLOCK_NUMBER.getValue())\r\n                    .addEthMonitorEvent(new EventOne())\r\n                    .addEthMonitorEvent(new EventThree())\r\n                    .setRetryStrategy(new EthRetry())\r\n                    .start();\r\n```\r\n\r\n可以访问官网了解更多：[https://magician-io.com](https://magician-io.com)"},"author":{"user":"https://learnblockchain.cn/people/12517","address":null},"history":null,"timestamp":1669374792,"version":1}