<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have searched the <a href="https://github.com/apache/dubbo/issues">issues</a> of this repository and believe that this is not a duplicate.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox"> I have checked the <a href="https://github.com/apache/dubbo/blob/master/FAQ.md">FAQ</a> of this repository and believe that this is not a duplicate.</li>
</ul>
<h3 dir="auto">Environment</h3>
<ul dir="auto">
<li>Dubbo version: 2.7.6</li>
<li>Operating System version: linux</li>
<li>Java version: 8</li>
</ul>
<h3 dir="auto">Steps to reproduce this issue</h3>
<ol dir="auto">
<li>define a interface <code class="notranslate">com.demo.api.DemoService</code></li>
<li>implements <code class="notranslate">com.demo.api.DemoService</code> with version (1.0)</li>
<li>implements <code class="notranslate">com.demo.api.DemoService</code> with versiono (1.1)</li>
</ol>
<h3 dir="auto">Expected Result</h3>
<p dir="auto">version 1.0 and 1.1 can be found .</p>
<h3 dir="auto">Actual Result</h3>
<p dir="auto">only 1.0 can be found.</p>
<p dir="auto">Does Dubbo means application level registry?</p>
<ul class="contains-task-list">
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have searched the <a href="https://github.com/apache/incubator-dubbo/issues">issues</a> of this repository and believe that this is not a duplicate.</li>
<li class="task-list-item"><input type="checkbox" id="" disabled="" class="task-list-item-checkbox" checked=""> I have checked the <a href="https://github.com/apache/incubator-dubbo/blob/master/FAQ.md">FAQ</a> of this repository and believe that this is not a duplicate.</li>
</ul>
<h3 dir="auto">Environment</h3>
<ul dir="auto">
<li>Dubbo version: 2.6.3</li>
</ul>
<h3 dir="auto">Step to reproduce this issue</h3>
<ol dir="auto">
<li>配置限流过滤器；</li>
<li>运行时修改系统时间；</li>
<li>时间差范围内的正常请求全部被拒；</li>
</ol>
<h3 dir="auto">原因描述</h3>
<p dir="auto">过滤器<a href="https://github.com/apache/incubator-dubbo/blob/master/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/TpsLimitFilter.java">org.apache.dubbo.rpc.filter.TpsLimitFilter</a> 通过调用 <a href="https://github.com/apache/incubator-dubbo/blob/master/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/tps/StatItem.java">org.apache.dubbo.rpc.filter.tps.StatItem</a>实现TPS限流。类org.apache.dubbo.rpc.filter.tps.StatItem实现了令牌桶算法，</p>
<p dir="auto"><a href="https://github.com/apache/incubator-dubbo/blob/f720ccb965d490e6cc328af8d3e9820cb6eaf8f7/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/tps/StatItem.java#L42-L46">https://github.com/apache/incubator-dubbo/blob/f720ccb965d490e6cc328af8d3e9820cb6eaf8f7/dubbo-rpc/dubbo-rpc-api/src/main/java/org/apache/dubbo/rpc/filter/tps/StatItem.java#L42-L46</a></p>
<p dir="auto">上面的实现通过原子计数器token来记录可用令牌数量，在能取到令牌的情况下，每次调用对令牌数的自减。令牌桶重置（重新设置为最大值）的条件：<strong><em>当前系统时间  &gt; 上次重置令牌的时间  + 时间间隔</em></strong>。</p>
<p dir="auto">该实现对系统时间具有依赖性：<br>
以<code class="notranslate">rate</code>=5000，<code class="notranslate">interval</code>=1000ms（即限流5000TPS），实际访问量为1000TPS为例，应用原来的时钟与标准时间同步，在运行过程中系统时钟发生了偏差（可能因为应用服务器同步了错误的NTP服务导致）：</p>
<ul dir="auto">
<li>
<p dir="auto">当系统时钟比标准时间慢（假设慢15分钟），则从差错时间点开始，当前系统时间重新变回到了15分钟前，而上次令牌重置时间并不会马上发生变化，导致 lastResetTime &gt; now （相差约15分钟），条件<code class="notranslate">now &gt; lastResetTime + interval</code> 在接下来的15分钟之内不再满足。意味着5000个令牌在1000TPS的实际访问量情况下5秒钟即被用完后，后续的14分钟55秒的时间段内，所有的请求由于取不到令牌全部被拒，直到15分钟后满足令牌桶重置的条件，才能恢复业务。</p>
</li>
<li>
<p dir="auto">当系统时间比标准时间快（假设快15分钟），当前系统时间和上次令牌桶重置时间的关系为： now &gt; lastResetTime（相差约15分钟），此时满足令牌桶重置的条件，限流可以正常工作。但是，在系统时间恢复至标准时间时，lastResetTime会比标准时间提前约15分钟，这时同样会导致系统时间恢复的15分钟后续的请求全部被拒绝，直到15钟后满足令牌通重置的条件。</p>
</li>
</ul>
<h3 dir="auto">Expected Result</h3>
<p dir="auto">在运行时系统时间发生变化，限流仍能正常发挥作用。</p>
<h3 dir="auto">Actual Result</h3>
<p dir="auto">运行过程中系统时间发生变化，导致限流不能正确执行，更严重的是在时间差范围内，请求会错误地全部被拒绝。</p>